在Zend Framework 2项目中,我们有两个Doctrine 2实体,我们希望从已经保存在数据库中的集合中删除一个元素......
所以我们有一个名为FormGroupConstraint的第一个实体:
/**
* FormGroupConstraint
*
* @ORM\Table(name="form_group_constraint")
* @ORM\Entity(repositoryClass="Application\Dao\FormGroupConstraintDao")
*/
class FormGroupConstraint {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @param \Doctrine\Common\Collections\ArrayCollection
* @ORM\OneToMany(targetEntity="Application\Entity\FormQuestionConstraint", mappedBy="groupConstraint", fetch="EAGER", cascade={"persist", "merge", "refresh", "remove"})
*/
protected $constraints;
public function __construct()
$this->constraints = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* @param \Doctrine\Common\Collections\ArrayCollection $constraints
*/
public function addConstraints($constraints) {
foreach ($constraints as $constraint) {
$this->constraints->add($constraint);
}
return $this->constraints;
}
/**
* @param \Doctrine\Common\Collections\ArrayCollection $constraints
*/
public function removeConstraints($constraintsToRemove) {
foreach ($constraintsToRemove as $key => $constraintToRemove) {
$this->constraints->removeElement($constraintToRemove);
}
return $this->constraints;
}
}
名为FormQuestionConstraint的子实体:
/**
* FormQuestionConstraint
*
* @ORM\Table(name="form_question_constraint")
* @ORM\Entity(repositoryClass="Application\Dao\FormQuestionConstraintDao")
*/
class FormQuestionConstraint
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var \Application\Entity\FormGroupConstraint
*
* @ORM\ManyToOne(targetEntity="Application\Entity\FormGroupConstraint", cascade= {"persist", "merge", "refresh", "remove"})
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="form_group_constraint_id", referencedColumnName="id")
* })
*/
protected $groupConstraint;
}
因此,如果我们尝试创建,持久化,刷新FormGroupConstraint实体,没问题, 但是当我们要删除$ constraints ArrayCollection的元素时,没有任何反应......
我们正在使用doctrine-orm-module为zend 2安装了dever master中的composer.phar ...
以下是我们尝试做的一个示例:
$constraint = $this->findConstraintByGroup(1);
$formGroupConstraint = $this->_em->findOneById(1);
$formGroupConstraint->getConstraints()->removeElement($constraint);
$this->_em->persist($formGroupConstraint);
$this->_em->flush();
没有错误,但没有删除或删除... 如果我们在persist()之前使用var_dump()getConstraints(),实际上该元素仍然在ArrayCollection中......
有人能解释我们如何做到这一点或为什么不删除该元素?
答案 0 :(得分:29)
可能有点迟了但是尝试将orphanRemoval=true
添加到关系的反面(OneToMany)
@ORM\OneToMany(
targetEntity="Application\Entity\FormQuestionConstraint",
mappedBy="groupConstraint",
cascade={"persist", "remove"},
orphanRemoval=true
)
答案 1 :(得分:4)
您可以在关系的orphanRemoval=true
一侧添加OneToMany
,例如:
@ORM\OneToMany(
targetEntity="Application\Entity\FormQuestionConstraint",
mappedBy="groupConstraint",
cascade={"all"},
orphanRemoval=true
)
此行为的原因是该实体已从ArrayCollection中删除,但该集合的内容仅由指向父实体的子实体的外键确定。
当doctrine下次查找父实体的子节点时,它仍然存在,并且当再次从数据库中获取ArrayCollection时,它将再次显示在下一个请求中。
如果orphanRemoval
设置为true
,则persist()
将删除此类子实体。
答案 2 :(得分:3)
因为您需要在FormQuestionConstraint
上进行引用:
$this->_em->remove($constraint);
$this->_em->flush();