我有这段代码
// 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;
然后我可以看到那里的所有物品。因此,它意味着所有项目都存在于主要对象中,但它不会持久存在。我不知道为什么。
如果有欠,反面问题。我怎样才能将这种关系从反向和反向转变为拥有
答案 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;
对于我的项目,我根据集合事件监听器制作了可重用的解决方案。 如果你有时间和技巧我鼓励你做同样的事情