Doctrine 变更实体';使用生命周期事件收集大量数据

Doctrine 变更实体';使用生命周期事件收集大量数据,doctrine,symfony4,Doctrine,Symfony4,我有一个实体A,与B和C class A { /** * @ORM\ManyToMany(targetEntity=B::class, inversedBy="as") */ private ?Collection $bs = null; /** * @ORM\ManyToMany(targetEntity=C::class, inversedBy="as") */ private

我有一个实体
A
,与
B
C

class A
{
    /**
     * @ORM\ManyToMany(targetEntity=B::class, inversedBy="as")
     */
    private ?Collection $bs = null;

    /**
     * @ORM\ManyToMany(targetEntity=C::class, inversedBy="as")
     */
    private ?Collection $cs = null;
}
在C和B之间也有一个单间:

class C
{
    /**
     * @ORM\OneToMany(targetEntity=B::class, mappedBy="c")
     */
    private Collection $bs;
}
我正在A上收听prePersist/preUpdate(尽管我也尝试过Flush/postPersist和postUpdate):

这样做的目的是注意A的Cs的变化,以便A的Bs总是从C的Bs中派生出来:

class ADoctrineListener
{
    public function prePersist(LifecycleEventArgs $args): void
    {
        $this->maybeUpdateBs($args);
    }

    public function preUpdate(LifecycleEventArgs $args): void
    {
        $this->maybeUpdateBs($args);
    }

    private function maybeUpdateBs(LifecycleEventArgs $args): void
    {
        $a = $this->getA($args);
        if (null === $a) {
            return;
        }

        if (false === $this->didCsChange($a)) {
            return;
        }

        $this->removeBsOfRemovedCs($a);
        $this->addBsOfAddedCs($a);
    }

    private function didCsChange(A $a): bool
    {
        return $a
            ->getCs()
            ->isDirty()
            ;
    }

    private function removeBsOfRemovedCs(A $a): void
    {
        $removedCs = $a
            ->getCs()
            ->getDeleteDiff()
        ;
        foreach ($removedCs as $c) {
            foreach ($c->getBs() as $b) {
                $a->removeB($b);
            }
        }
    }

    private function addBsOfAddedCs(A $a): void
    {
        $insertedCs = $a
            ->getCs()
            ->getInsertDiff()
        ;
        foreach ($insertedCs as $c) {
            foreach ($c->getBs() as $b) {
                $a->addB($b);
            }
        }
    }

    private function getA(LifecycleEventArgs $args): ?A
    {
        if (false === $args->getObject() instanceof A) {
            return null;
        }

        return $args->getObject();
    }
}
逻辑本身运行良好,我可以看到对象处于我想要保存的状态

但是,问题是,我无法将其持久化到DB

我尝试过任何我能想到的方法,只要重新坚持A:

$args->getEntityManager()->persist($a)
…要重新计算更改集,请执行以下操作:

$em = $args->getEntityManager();
$uow  = $em->getUnitOfWork();
$meta = $em->getClassMetadata(get_class($a));
$uow->recomputeSingleEntityChangeSet($meta, $a);
以及它们的组合,但当我没有得到错误时,新关联的Bs将不会出现在DB中

所以我想知道的是,如何正确地让教义知道我对主体的相关集合做了更改,并让它坚持下去

$em = $args->getEntityManager();
$uow  = $em->getUnitOfWork();
$meta = $em->getClassMetadata(get_class($a));
$uow->recomputeSingleEntityChangeSet($meta, $a);