教义2没有坚持从拥有一方到多方的关系

时间:2012-08-17 08:01:02

标签: php symfony doctrine-orm

我有这段代码

// ONE to many Bidir -- inverse side
    /**
     * @ORM\OneToMany(targetEntity="Item", mappedBy="Room", cascade={"persist"})
     **/
    protected $items;

另一方

// ONE to many Bidir-- own side
    /**
     * @ORM\ManyToOne(targetEntity="Room", inversedBy="items")
     * @ORM\JoinColumn(name="room_id", referencedColumnName="id")
     **/
    protected $room;

我的问题是我去了项目页面并且我选择了房间,然后我可以在房间页面看到项目preselecetd

但是,如果我进入Room页面并尝试多选多项,那么这些项目就不会持续存在

编辑:我已经看到它只发生在OneToMany关系中。对于Manyto很多他们工作正常

EDIT2:

我说的是后端区域,我有表格和选择框,我可以选择多个项目。这种形式/ CRUD代码/控制器由学说生成。所以我不需要添加任何额外的功能。这是我的控制器代码

$editForm   = $this->createForm(new RoomType(), $entity);


        $request = $this->getRequest();

        $editForm->bindRequest($request);
        if ($editForm->isValid()) {
            $em->persist($entity);
            $em->flush();

当我尝试在这样的控制器中走过时

foreach($entity->getItems() as $item)
        echo $item;

然后我可以看到那里的所有物品。因此,它意味着所有项目都存在于主要对象中,但它不会持久存在。我不知道为什么。

如果有欠,反面问题。我怎样才能将这种关系从反向和反向转变为拥有

2 个答案:

答案 0 :(得分:10)

根据您在注释中的评论,您的代码是错误的。

这是拥有方,因为您指定了inversedBy属性:

/**
 * ONE to many Bidir-- Inverse side
 * @ORM\ManyToOne(targetEntity="Room", inversedBy="items")
 * @ORM\JoinColumn(name="room_id", referencedColumnName="id")
 **/
protected $room;

这是反面(因为它具有mappedBy属性):

/**
 * ONE to many Bidir -- owning side
 * @ORM\OneToMany(targetEntity="Item", mappedBy="Room", cascade={"persist"})
 **/
protected $items;

所以你的代码说:Item是拥有方,Room是反面。

  

双向关系的拥有方必须引用它   通过OneToOne的反转属性使用反面,   ManyToOne,或ManyToMany映射声明。 inversedBy属性   指定实体中与其相反的字段   关系。

使它更干净:

  

拥有方必须使用OneToOne的inversedBy属性,   ManyToOne,或ManyToMany映射声明。 inversedBy属性   包含反面的关联字段的名称。

而对于反面:

  

双向关系的反面必须引用它   拥有OneToOne的 mappedBy属性使用,   OneToMany或ManyToMany映射声明。 mappedBy属性   指定作为所有者的实体中的字段   关系。

而且,再次:

  

反面必须使用OneToOne的mappedBy属性,   OneToMany或ManyToMany映射声明。 mappedBy属性   包含所属方的关联字段的名称。

另外,另一个重要的考虑因素:

  

ManyToOne始终是双向关联的拥有方。

     

OneToMany始终是双向关联的反面

因此,对于从反面(房间)保留项目,您必须检查已选择/取消选择的项目以及房间是否已包含该项目。

答案 1 :(得分:3)

只需使用你循环来设置空间。项目是侧面,你编辑反面(房间)。 Symfony2在编辑逆序时不会更新欠边。

最简单的解决方案是在持久化之前使用循环:

foreach($entity->getItems() as $item){
    $item->setRoom($room);
}

并反向级联:

/**
 * @ORM\OneToMany(targetEntity="Item", mappedBy="Room", cascade={"persist"})
 **/
protected $items;

对于我的项目,我根据集合事件监听器制作了可重用的解决方案。 如果你有时间和技巧我鼓励你做同样的事情