学说 2 级联坚持保存太多
doctrine 2 cascade persist saving too much
所以这是我在 EventListener 上的 prePersist
public function prePersist(LifecycleEventArgs $args)
{
//the first entity will have the PMP, so we catch it and continue to skip this if after this
if ($this->pmp == null) {
$this->pmp = $args->getEntity()->getPmp();
}
$taxonomicClass = $args->getEntity();
if($taxonomicClass instanceof TaxonomicClass){
if(is_null($taxonomicClass->getId())){
//here it says that i have created a new entity, need to persist it via cascade={"persist"}
$taxonomicClass->setPmp($this->pmp);
}
}
}
没关系,我在上面添加了注释:
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Pmp", cascade={"persist"})
* @ORM\JoinColumn(name="pmp_id", referencedColumnName="id", nullable=false)
**/
private $pmp;
它保存了我层次结构中的所有内容,甚至是一个新的 PMP,一个已经存在于数据库中的对象!
我想要的是我从层次结构中保存的所有内容都需要与我通过的 PMP 相关,但是当我设置 $taxonomicClass->setPmp($this->pmp);
学说时认为我创建了一个新的 PMP 实例,因为我不,我只是想让这个人和PMP有联系。
我试过将 merge
放在级联选项上,但它只适用于 persist
,如何使学说不创建新实例,而是使用我通过的实例?
注意到我的问题,我正在从内存中分配一个属性,我应该从数据库中检索他以了解学说。
public function prePersist(LifecycleEventArgs $args)
{
if ($this->pmp == null) {
$this->pmp = $args->getEntity()->getPmp();
}
$taxonomicClass = $args->getEntity();
if($taxonomicClass instanceof TaxonomicClass){
if(is_null($taxonomicClass->getId())){
//this solved the problem
$pmp = $args->getEntityManager()->getRepository("AppBundle:Pmp")->find($this->pmp->getId());
$taxonomicClass->setPmp($pmp);
}
}
}
我现在要记住,当创建了一个新实体但不需要保存它时,您必须从数据库中检索它,cascade={"persist"}
甚至没有必要
所以这是我在 EventListener 上的 prePersist
public function prePersist(LifecycleEventArgs $args)
{
//the first entity will have the PMP, so we catch it and continue to skip this if after this
if ($this->pmp == null) {
$this->pmp = $args->getEntity()->getPmp();
}
$taxonomicClass = $args->getEntity();
if($taxonomicClass instanceof TaxonomicClass){
if(is_null($taxonomicClass->getId())){
//here it says that i have created a new entity, need to persist it via cascade={"persist"}
$taxonomicClass->setPmp($this->pmp);
}
}
}
没关系,我在上面添加了注释:
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Pmp", cascade={"persist"})
* @ORM\JoinColumn(name="pmp_id", referencedColumnName="id", nullable=false)
**/
private $pmp;
它保存了我层次结构中的所有内容,甚至是一个新的 PMP,一个已经存在于数据库中的对象!
我想要的是我从层次结构中保存的所有内容都需要与我通过的 PMP 相关,但是当我设置 $taxonomicClass->setPmp($this->pmp);
学说时认为我创建了一个新的 PMP 实例,因为我不,我只是想让这个人和PMP有联系。
我试过将 merge
放在级联选项上,但它只适用于 persist
,如何使学说不创建新实例,而是使用我通过的实例?
注意到我的问题,我正在从内存中分配一个属性,我应该从数据库中检索他以了解学说。
public function prePersist(LifecycleEventArgs $args)
{
if ($this->pmp == null) {
$this->pmp = $args->getEntity()->getPmp();
}
$taxonomicClass = $args->getEntity();
if($taxonomicClass instanceof TaxonomicClass){
if(is_null($taxonomicClass->getId())){
//this solved the problem
$pmp = $args->getEntityManager()->getRepository("AppBundle:Pmp")->find($this->pmp->getId());
$taxonomicClass->setPmp($pmp);
}
}
}
我现在要记住,当创建了一个新实体但不需要保存它时,您必须从数据库中检索它,cascade={"persist"}
甚至没有必要