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

Ran*_*ngh 10 php symfony doctrine-orm

我有这个代码

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

另一边

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

我的问题是,我去项目页面,我选择房间,然后我可以在房间页面看到项目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();
Run Code Online (Sandbox Code Playgroud)

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

foreach($entity->getItems() as $item)
        echo $item;
Run Code Online (Sandbox Code Playgroud)

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

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

gre*_*emo 10

根据您在注释中的注释,您的代码是错误的.

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

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

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

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

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

拥有侧的双向关系必须通过参考它的逆侧使用的的inversedBy属性的OneToOne,多对一,或多对多映射声明的.inversedBy属性指定实体中的字段,该字段是关系的反面.

为了使它更干净:

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

而对于反方:

逆侧的双向关系必须通过参考其持有端使用所述的的mappedBy属性的OneToOne,一对多,或多对多映射声明的.mappedBy属性指定作为关系所有者的实体中的字段.

然后再次:

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

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

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

OneToMany始终是双向关联的反面

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

  • 我可能错误地说哪一方拥有和反向但代码应该在两个方向都有效.我对每一方都进行了级联{persist},但两方面都没有效果.即使你不是那个房间的项目,我选择了5个项目,数据库中什么都没有.而这又发生在一个班级.所以我想我需要在我的代码中添加一些东西来反转.我的代码是否正常,无论拥有什么和反面 (2认同)