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

Posted

技术标签:

【中文标题】Symfony2-Doctrine:ManyToMany 关系未保存到数据库【英文标题】:Symfony2-Doctrine: ManyToMany relation is not saved to database 【发布时间】:2011-10-26 01:40:14 【问题描述】:

我有两个名为 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;
    

还有:

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.

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

属于该类别的项目列表显示在表格下方。

当我提交表单时,被选中的项目被添加到Category项目列表中,如下图所示,但它没有存储在数据库中,如果刷新页面,它就会消失。

谁能帮我解决这个问题? 提前致谢。

【问题讨论】:

以上帖子帮助我在实体中映射多对多映射。是否有任何好的(完整)文档链接可以显示所有类型的数据库映射(实体映射)? 【参考方案1】:

我有同样的问题...我想你忘了

$category->addItems($item);
$em->persist($category);
$em->flush();

【讨论】:

不需要persist(),因为这两个实体都已被管理【参考方案2】:

您的类别实体是关系的inverse side。

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

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

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

【讨论】:

doctrine-project.org/docs/orm/2.0/en/reference/… 花了我几个小时的调查,但是当这种情况发生在表单中时,您还必须在相应的表单字段上设置 'by_reference' => false。否则,永远不会调用 add* 和 remove* 方法。 不要像我一样做:不要在两边都添加这个方法,否则你的实体会循环,直到你的服务器重新启动...... @spackmat 'by_reference' => false 仅对 CollectionType 有用 @Trix 是对的。虽然您可以将“by_reference”与 EntityType 一起使用,但您可能会遇到重复的关键 SQL 错误。 (它仅适用于从 mappedBy 端删除多对多链接。)

以上是关于Symfony2-Doctrine:ManyToMany 关系未保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

将 Django 查询集中的所有值相加

数据库表关系:多对多的三中方式

Django:如何检查用户是不是已经在 ManyToManyField 上投票?

关于与查询构建器的“一对多”关系的教义内连接

Symfony2 - Doctrine - 在实体管理器刷新调用中捕获错误

Symfony2 - 学说:模式:更新失败,实体在包之外(解耦)