0

多対多の関係の1つに問題があります。フォームをデバッグしましたが、フォームの検証後、選択したオブジェクトが実際にはエンティティオブジェクトに含まれていることがわかりましたが、データベースに保存されないため、マッピングコードに問題があるはずですが、作業中のオブジェクトからコピーして貼り付けました1つはフィールドとパスを置き換えただけです...

これが会社オブジェクトの関連コードです

/**
 * @ORM\ManyToMany(targetEntity="BizTV\ContentManagementBundle\Entity\Template", inversedBy="companies")
 * @ORM\JoinTable(name="templatePermissions")
 */
private $templatePermissions;

/**
 * Add templatePermissions
 *
 * @param BizTV\ContentManagementBundle\Entity\Template $templatePermissions
 */
public function addTemplate(\BizTV\ContentManagementBundle\Entity\Template $templatePermissions)
{
    $this->templatePermissions[] = $templatePermissions;
}

およびテンプレートオブジェクト

/**
 * @ORM\ManyToMany(targetEntity="BizTV\BackendBundle\Entity\company", mappedBy="templatePermissions")
 */
private $companies;
/**
 * Add companies
 *
 * @param BizTV\BackendBundle\Entity\company $companies
 */
public function addCompany(\BizTV\BackendBundle\Entity\company $companies)
{
    $this->companies[] = $companies;
}

/**
 * Get companies
 *
 * @return Doctrine\Common\Collections\Collection 
 */
public function getCompanies()
{
    return $this->companies;
}

更新するためのコード(および作成するためのコードは類似しており、同じ問題があります)は単なる標準です...

public function updateAction($id)
{
    $em = $this->getDoctrine()->getEntityManager();

    $entity = $em->getRepository('BizTVContentManagementBundle:Template')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Template entity.');
    }

    $editForm   = $this->createForm(new TemplateType(), $entity);
    $deleteForm = $this->createDeleteForm($id);

    $request = $this->getRequest();

    $editForm->bindRequest($request);

    if ($editForm->isValid()) {


        //DEBUG
        // foreach($entity->getCompanies() as $c) {
            // echo $c->getCompanyName();   
        // }
        // die;

        $em->persist($entity);
        $em->flush();

        $this->getRequest()->getSession()->setFlash('success', 'Template '.$entity->getId().' har uppdaterats.' );

        return $this->redirect($this->generateUrl('listTemplates'));
    }

これが私のフォームです、私が言ったように、それは私のオブジェクト(テンプレートエンティティ)にものを入れるために完全に機能しますが、DBに永続化されません...

    $builder
    ->add('companies', 'entity', array(
            'label' => 'Företag som har tillgång till mallen',
            'multiple' => true,   // Multiple selection allowed
            'expanded' => true,   // Render as checkboxes
            'property' => 'company_name',
            'class'    => 'BizTV\BackendBundle\Entity\company',
        ))
        ;   

私は何が欠けていますか?

4

1 に答える 1

3
  1. 所有/逆側の選択に注意してください。所有側は、永続的なアクションを担当する側である必要があります。あなたの場合、所有側は会社ではなくテンプレートエンティティである必要があります。

    詳細については、こちらをご覧ください。

    http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/association-mapping.html#picking-owning-and-inverse-side

  2. 会社のエンティティクラス名は小文字で始まりますか?いいえの場合、タイプミスがあります。

    BizTV \ BackendBundle \ Entity \ company

  3. 永続化時にカスケードを追加してみてください

最後に、Companyエンティティのリレーション定義は次のようになります。

/**
 * @ORM\ManyToMany(targetEntity="BizTV\BackendBundle\Entity\company", inversedBy="templatePermissions", cascade={"persist"})
 */
private $companies;
于 2012-09-17T09:23:50.120 に答える