2016-10-20 3 views
0

У меня есть проблема для завершения отношения 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

 /** 
    * 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

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

После запроса GET на место для редактирования тега, сервер возвращает поле ввода для изменения названия тега заполняется текущим значением и MULTISELECT поля ввода с отмеченными контактами, которые в настоящее время, связанные с тег. Когда я вношу изменения в поле multiselect и отправляю, изменения не записываются.

Что может быть проблема здесь? Как решить эту проблему и сохранить код чистым?

Атрибут контактов представлен в методе контроллера как persistentcollection type, а его флаг помечен как грязный.


UDATE 1:

тега (GE & себе) 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; 
} 

Организатора (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

Вы можете показать геттер и сеттеры для атрибутов 'contacts' в' Tag.php'? – Jeet

+0

Конечно. Теперь вы можете увидеть их в UDATE 1. – OHNH

+0

Я видел методы, Не вижу проблем. однако вы можете объяснить, что вы подразумеваете под этим: «Атрибут контактов представлен в методе контроллера как тип persistentcollection, а его флаг помечен как грязный». – Jeet

ответ

0

У меня есть несколько предложений для отображение информации.

Вы не должны cascade={"all"} если вы create или edit или delete дочерние объекты на менеджера объекта flush().

Во-вторых, зачем вам нужно определять @ORM\JoinTable информацию в обоих концах вашего картографирования?

Вы должны определить его только от mapped-by. В вашем примере вы должны иметь @ORM\JoinTable только от Contact Сущность, как она есть mapped-by информации. Documents here.

Хотя я не уверен, что это решит вашу проблему, но вы всегда должны иметь правильную картографическую информацию.

Надеюсь, это поможет!

Смежные вопросы