2016-10-20 18 views
0

WebアプリケーションでManyToMany関係を完了する際に問題があります。エンティティレコードの関連付け問題

エンティティの連絡先とタグがあります。

問い合わせ

/** 
* Contact 
* 
* @ORM\Table(name="contacts") 
* @ORM\Entity(repositoryClass="Admin\MainBundle\Repository\ContactRepository") 
*/ 
class Contact 
{ 

/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\ManyToMany(targetEntity="Tag", inversedBy="contacts", cascade={"all"}) 
* @ORM\JoinTable(name="contact_tag_relation", 
*  joinColumns={@ORM\JoinColumn(name="contact_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")} 
* ) 
*/ 
private $tags; 

タグ

 /** 
    * Tag 
    * 
    * @ORM\Table(name="tags") 
    * @ORM\Entity(repositoryClass="Admin\MainBundle\Repository\TagRepository") 
*/ 
class Tag 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 

    private $id; 

    /** 
    * @var ArrayCollection 
    * @ORM\ManyToMany(targetEntity="Admin\MainBundle\Entity\Contact", mappedBy="tags", cascade={"all"}) 
    * @ORM\JoinTable(name="contact_tag_relation", 
    *  joinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="contact_id", referencedColumnName="id")} 
    * ) 
    */ 
    private $contacts; 

コントローラの要求ハンドラ: - へ - 多くの次のコードで書かれている多くの関係。

public function editAction(Request $request, Tag $tag, Contact $contact = null) 
{ 
    $deleteForm = $this->createDeleteForm($tag); 
    $editForm = $this->createForm('Admin\MainBundle\Form\TagType', $tag); 
    $editForm->handleRequest($request); 

    if ($editForm->isSubmitted() && $editForm->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->flush(); 

     return $this->redirectToRoute('tags_edit', array('id' => $tag->getId())); 
    } 

    return $this->render('AdminMainBundle:Tag:edit.html.twig', array(
     'tag' => $tag, 
     'edit_form' => $editForm->createView(), 
     'delete_form' => $deleteForm->createView(), 
    )); 
} 

TagType法タグを編集するための場所にGET要求後

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('title') 
     ->add('contacts'); 
} 

、サーバは、現在に関連する顕著な接点と電流値と複数選択入力フィールドを充填したタグのタイトルを変更するための入力フィールドを返しますタグ。 複数選択欄に変更を加えて送信すると、変更が記録されません。

ここで問題が発生する可能性がありますか?どのようにこれを解決し、コードをきれいに保つ?

contacts属性は、コントローラのメソッドでは永続的コレクション型として表され、その属性はダーティーとしてフラグが付けられます。


UDATE 1:

タグの(GE & SE)tters:

/** 
* Add contact 
* 
* @param \Admin\MainBundle\Entity\Contact $contact 
* 
* @return Tag 
*/ 
public function addContact(\Admin\MainBundle\Entity\Contact $contact) 
{ 
    $this->contacts[] = $contact; 

    return $this; 
} 

/** 
* Remove contact 
* 
* @param \Admin\MainBundle\Entity\Contact $contact 
*/ 
public function removeContact(\Admin\MainBundle\Entity\Contact $contact) 
{ 
    $this->contacts->removeElement($contact); 
} 

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

連絡先の(SE GE &)tters:

/** 
* Add tag 
* 
* @param \Admin\MainBundle\Entity\Tag $tag 
* 
* @return Contact 
*/ 
public function addTag(\Admin\MainBundle\Entity\Tag $tag) 
{ 
    $this->tags[] = $tag; 

    return $this; 
} 

/** 
* Remove tag 
* 
* @param \Admin\MainBundle\Entity\Tag $tag 
*/ 
public function removeTag(\Admin\MainBundle\Entity\Tag $tag) 
{ 
    $this->tags->removeElement($tag); 
} 

/** 
* Get tags 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getTags() 
{ 
    return $this->tags; 
} 
+0

'Tag.php'の' contacts'属性のゲッターとセッターを表示できますか? – Jeet

+0

もちろん。今すぐあなたはそれらをUDATE 1で見ることができます。 – OHNH

+0

私は方法を見ましたが、何の問題も見ません。しかし、あなたはこれによって何を意味するのか説明できます: '連絡先属性は、コントローラのメソッドで永続収集型として表され、その属性はダーティーとしてフラグが立てられます.' – Jeet

答えて

0

私はのためにいくつかの提案を持っていますマッピング情報。

あなたは、エンティティ・マネージャflush()cascade={"all"}あなたない限りcreateまたはeditまたはdelete子エンティティを持つべきではありません。

第2に、マッピングの両端に@ORM\JoinTableの情報を定義する必要があるのはなぜですか?

mapped-by側からのみ定義する必要があります。あなたの例では、@ORM\JoinTableにはContactエンティティのみがあり、それにはmapped-byという情報があります。 Documents here

これはあなたの問題を解決するかどうかはわかりませんが、常に正しいマッピング情報が必要です。

希望すると便利です。

関連する問題