我有 2 个实体:
- 轨迹
- 参考
在每个轨迹上,我们可以定义许多不同的引用,并且许多轨迹可以使用引用。然后我有一个多对多的关系。
但是,就我而言,如果没有由轨迹链接,引用就什么都不是,我不想将其保留在我的 BDD 中。
尝试列表:
- 参考拥有的关系:
- 参照实体中的孤立移除(在拥有侧):删除轨迹
- LocusEntity 中的 orphanRemoval (在反转侧):不执行任何操作
- 轨迹拥有的关系:
- 引用实体中的孤立删除(在反转侧):不执行任何操作
- LocusEntity中的orphanMove(在拥有的一侧):删除引用,尽管被其他Locus使用过
参考资料.php
/**
* Reference
*
* @ORMTable(name="reference")
* @ORMEntity(repositoryClass="AppBundleRepositoryReferenceRepository")
*/
class Reference
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMManyToMany(targetEntity="AppBundleEntityLocus", inversedBy="references")
*/
private $locus;
public function addLocus(Locus $locus)
{
if (!$this->locus->contains($locus)) {
$this->locus->add($locus);
$locus->addReference($this);
}
return $this;
}
public function removeLocus(Locus $locus)
{
if ($this->locus->contains($locus)) {
$this->locus->removeElement($locus);
}
return $this;
}
public function getLocus()
{
return $this->locus;
}
轨迹.php
/**
* @ORMEntity(repositoryClass="AppBundleRepositoryLocusRepository")
*/
class Locus extends GeneticEntry
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMManyToMany(targetEntity="AppBundleEntityReference", mappedBy="locus", orphanRemoval=true)
*/
private $references;
public function addReference(Reference $reference)
{
$this->references->add($reference);
return $this;
}
public function removeReference(Reference $reference)
{
if ($this->references->contains($reference)) {
$this->references->removeElement($reference);
}
return $this;
}
public function getReferences()
{
return $this->references;
}
目前,我选择在postUpdate事件上使用EventListener,我测试ArrayCollection,如果为空,则删除实体:
引用侦听器.php:
<?php
namespace AppBundleEventListener;
use AppBundleEntityReference;
use DoctrineORMEventLifecycleEventArgs;
class ReferenceListener
{
public function postUpdate(LifecycleEventArgs $args)
{
$object = $args->getObject();
if (!$object instanceof Reference) {
return;
}
// If the Reference have no Locus and no Chromosomes, delete it
if ($object->getLocus()->isEmpty() && $object->getChromosomes()->isEmpty()) {
$args->getEntityManager()->remove($object);
$args->getEntityManager()->flush();
}
}
}