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