У меня есть два класса модели PHP с именем Категория и Элемент. Категория может иметь много элементов, а элемент может принадлежать многим категориям. Я создал отношение ManyToMany к обоим классам:
class Category
{
/**
* @ORM\ManyToMany(targetEntity="Item", mappedBy="categories", cascade={"persist"})
*/
private $items;
/**
* Add items
*
* @param Ako\StoreBundle\Entity\Item $items
*/
public function addItems(\Ako\StoreBundle\Entity\Item $items)
{
$this->items[] = $items;
}
/**
* Get items
*
* @return Doctrine\Common\Collections\Collection
*/
public function getItems()
{
return $this->items;
}
}
и
class Item
{
/**
* @ORM\ManyToMany(targetEntity="Category", inversedBy="items", cascade={"persist"})
* @ORM\JoinTable(name="item_category",
* joinColumns={@ORM\JoinColumn(name="item_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")}
* )
*/
private $categories;
/**
* Add categories
*
* @param Ako\StoreBundle\Entity\Category $categories
*/
public function addCategories(\Ako\StoreBundle\Entity\Category $categories)
{
$this->categories[] = $categories;
}
/**
* Get categories
*
* @return Doctrine\Common\Collections\Collection
*/
public function getCategories()
{
return $this->categories;
}
}
Теперь в моем контроллере:
$em = $this->getDoctrine()->getEntityManager();
$item = $em->getRepository('AkoStoreBundle:Item')->find($item_id);
$category = $em->getRepository('AkoStoreBundle:Category')->find($category_id);
$category->addItems($item);
$em->flush();
// Render the same page again.
На этой странице я показываю список всех элементов в поле выбора. Пользователь может выбрать один элемент и добавить его в категорию.
Список элементов, относящихся к категории, показан ниже формы.
Когда я отправляю форму, выбранный элемент добавляется в список элементов категории и отображается ниже, но он не хранится в базе данных, а при обновлении страницы он исчезает.
Может ли кто-нибудь помочь мне в этом? Спасибо заранее.
Сущность вашей категории - это обратная сторона отношения.
Попробуйте изменить addItems, чтобы выглядеть так:
public function addItem(\Ako\StoreBundle\Entity\Item $item)
{
$item->addCategory($this);
$this->items[] = $item;
}
Обратите внимание, что я изменил ваши множественные имена на единичные, поскольку вы имеете дело с отдельными объектами, а не с коллекциями.
'by_reference' => false
несколько часов на изучение, но когда это происходит в форме, вы также должны установить 'by_reference' => false
в соответствующих полях формы. В противном случае методы add * и remove * никогда не вызываются.
У меня были те же проблемы... Я думаю, вы забыли
$category->addItems($item);
$em->persist($category);
$em->flush();
persist()
поскольку обе сущности уже управляются