多对多关系,孤儿移位



我有 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();
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新