10

我有这个代码

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

我的问题是我进入项目页面并选择了房间,然后我可以在房间页面中看到预先选择的项目

但是,如果我转到 Room 页面并尝试多选许多项目,那么这些项目不会被保留

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

编辑2:

我说的是我有表单和选择框的后端区域,我可以在其中选择多个项目。此表单/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;

然后我可以在那里看到所有你的项目。所以这意味着所有项目都在主要对象中,但它没有持久化它们。我不知道为什么。

如果有欠款,反面问题。我怎样才能将关系从由于反向和反向转换为拥有

4

2 回答 2

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 属性来引用相反方。inversedBy 属性指定实体中作为关系反面的字段。

为了让它更干净:

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

而对于反面:

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

然后再次:

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

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

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

OneToMany 始终是双向关联的反面

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

于 2012-08-17T09:21:10.400 回答
3

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

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

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

并在反面级联:

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

对于我的项目,我基于收集事件侦听器制作了可重用的解决方案。如果您有时间和技能,我鼓励您也这样做

于 2012-08-21T12:59:34.010 回答