Symfony2-Doctrine:ManyToMany关系未保存到数据库

Omi*_*gar 57 many-to-many symfony doctrine-orm

我有两个名为Category和Item的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

和:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在在我的控制器中:

$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.
Run Code Online (Sandbox Code Playgroud)

在此页面中,我显示了选择字段中所有项目的列表.用户可以选择一个项目,并将其添加到类别中.

属于该类别的项目列表显示在表单下方.

当我提交表单时,所选项目将添加到类别项目列表中,如下所示,但它不存储在数据库中,如果刷新页面,它将消失.

有人可以帮我这个吗?提前致谢.

tim*_*dev 88

您的类别实体是关系的反面.

尝试将addItems更改为如下所示:

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

请注意,我将复数名称更改为单数,因为您处理的是单个实体,而不是集合.

  • 花了我几个小时的时间进行调查,但是当在Form中发生这种情况时,你还必须在相应的表单字段上设置''by_reference'=> false`.否则,永远不会调用add*和remove*方法. (19认同)
  • http://www.doctrine-project.org/docs/orm/2.0/en/reference/association-mapping.html#picking-owning-and-inverse-side (2认同)