Symfony2-Doctrine: отношение ManyToMany не сохраняется в базе данных

52

У меня есть два класса модели 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.

На этой странице я показываю список всех элементов в поле выбора. Пользователь может выбрать один элемент и добавить его в категорию.

Список элементов, относящихся к категории, показан ниже формы.

Когда я отправляю форму, выбранный элемент добавляется в список элементов категории и отображается ниже, но он не хранится в базе данных, а при обновлении страницы он исчезает.

Может ли кто-нибудь помочь мне в этом? Спасибо заранее.

  • 0
    Вышеприведенный пост очень помогает мне сопоставить сопоставление «многие ко многим» в Entity. Есть ли какая-либо хорошая (полная) ссылка на документацию, показывающая все типы сопоставления базы данных (сопоставления сущностей)?
Теги:
many-to-many
doctrine2

2 ответа

87
Лучший ответ

Сущность вашей категории - это обратная сторона отношения.

Попробуйте изменить addItems, чтобы выглядеть так:

public function addItem(\Ako\StoreBundle\Entity\Item $item)
    {
        $item->addCategory($this);
        $this->items[] = $item;
    }

Обратите внимание, что я изменил ваши множественные имена на единичные, поскольку вы имеете дело с отдельными объектами, а не с коллекциями.

  • 2
    doctrine-project.org/docs/orm/2.0/en/reference/...
  • 16
    У меня 'by_reference' => false несколько часов на изучение, но когда это происходит в форме, вы также должны установить 'by_reference' => false в соответствующих полях формы. В противном случае методы add * и remove * никогда не вызываются.
Показать ещё 3 комментария
2

У меня были те же проблемы... Я думаю, вы забыли

$category->addItems($item);
$em->persist($category);
$em->flush();
  • 12
    Не нужно использовать persist() поскольку обе сущности уже управляются

Ещё вопросы

Сообщество Overcoder
Наверх
Меню