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);