У меня есть проблема для завершения отношения 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;
}
Вы можете показать геттер и сеттеры для атрибутов 'contacts' в' Tag.php'? – Jeet
Конечно. Теперь вы можете увидеть их в UDATE 1. – OHNH
Я видел методы, Не вижу проблем. однако вы можете объяснить, что вы подразумеваете под этим: «Атрибут контактов представлен в методе контроллера как тип persistentcollection, а его флаг помечен как грязный». – Jeet