我有这个代码

// 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/

10-11 14:26