Symfony 条令ORM:填充持久化上相关实体的联接列

Symfony 条令ORM:填充持久化上相关实体的联接列,symfony,orm,doctrine-orm,one-to-many,Symfony,Orm,Doctrine Orm,One To Many,给定ORM中的以下简单实体,是否有一种简单的方法来创建一个父对象对象,向其添加子对象,然后在一次调用EntityManager#persist()和EntityManager#flush()中持久化父对象及其子对象 目前,我正在持久化父项,刷新实体管理器,然后将父项添加到每个子项,持久化每个子项,然后再次刷新实体管理器。否则,每个子项都会持久化到数据库中,但联接列为空。我在父对象上尝试了生命周期回调,但是postPersist()是在所有实体被持久化之后调用的,而不是在父实体之后和子实体被持久化

给定ORM中的以下简单实体,是否有一种简单的方法来创建一个
父对象
对象,向其添加
子对象
,然后在一次调用
EntityManager#persist()
EntityManager#flush()
中持久化父对象及其子对象

目前,我正在持久化
父项
,刷新实体管理器,然后将
父项
添加到每个
子项
,持久化每个
子项
,然后再次刷新实体管理器。否则,每个
子项
都会持久化到数据库中,但联接列为空。我在
父对象上尝试了生命周期回调,但是
postPersist()
是在所有实体被持久化之后调用的,而不是在父实体之后和子实体被持久化之前调用的

class Parent {
  /**
   * @ORM\Id
   * @ORM\Column(type="integer")
   * @ORM\GeneratedValue(strategy="AUTO")
   */
  protected $id;

  /**
   * @ORM\OneToMany(
   *    targetEntity="Child",
   *    mappedBy="parent",
   *    cascade={"persist", "merge", "remove"}
   * )
   */
  protected $children;

  public function __construct () {
    $this->children = new ArrayCollection;
  }

  public function addChild (Child $child) {
    $this->children[] = $child
  }
}

class Child {
  /**
   * @ORM\Id
   * @ORM\Column(type="integer")
   * @ORM\GeneratedValue(strategy="AUTO")
   */
  protected $id;

  /**
   * @ORM\ManyToOne(
   *    targetEntity="Parent",
   *    inversedBy="children",
   * )
   */
  protected $parent;
}

您不必手动持久化子项。这就是
cascade={“persist”}
的作用

父级
添加子级()
中尝试此操作:


现在,您可以持久化并刷新,只有父级及其子级也将被持久化。

每次使用manytone或onetomany关系时,请使用 php应用程序/控制台原则:生成:实体
在控制台中,它将自动创建函数addChild和removeChild。这样,您当然不需要手动创建它们。那很有魅力。非常感谢。我认为设置子项就足够了,但显然不行。我认为这还不够的原因是,在DB中,关系完全是在子项方面描述的,在父表中没有任何内容。因此,显然您必须更改子表,这对应于持久化子实体,如果持久化父实体,默认情况下不发生这种情况可能会更安全。我做了,addChild()方法没有包括对$Child->setParent()的调用
public function addChild (Child $child) {
    $this->children[] = $child;
    $child->setParent($this);
}