我有这个代码
// 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;
我的问题是我转到项目页面,然后选择“房间”,然后我可以在“房间”页面中看到预选的项目
但是,如果我转到“房间”页面并且尝试多选多个项目,则这些项目将不会保留
编辑:我已经看到,这仅发生在OneToMany关系船上。对于许多人来说,他们工作得很好
编辑2:
我说的是后端区域,那里有表单和选择框,可以在其中选择多个项目。此表单/CRUD代码/ Controller 是根据原则生成的。所以我不需要添加任何额外的功能。无论如何这是我的 Controller 代码
$editForm = $this->createForm(new RoomType(), $entity);
$request = $this->getRequest();
$editForm->bindRequest($request);
if ($editForm->isValid()) {
$em->persist($entity);
$em->flush();
当我尝试像这样进入 Controller 时
foreach($entity->getItems() as $item)
echo $item;
然后我可以在那里看到所有的东西。因此,这意味着所有项目都存在于主要对象中,但没有持久化它们。我不知道为什么。
如果有欠款,反面问题。我该如何改变关系,从归因于逆和归因于拥有
最佳答案
根据注释中的注释,您的代码是错误的。
这是拥有的一面,因为您指定了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
是相反者。为了使其更干净:
而对于反面:
然后再次:
另外,另一个重要的考虑因素是:
因此,要从反面(房间)保留项目,您必须检查已选择/取消选择哪个项目,以及房间是否已经包含该项目。
关于php - 教义2不坚持从拥有一方到多方的关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12001979/