Orm 原则:在EventSubscriber(onFlush)中更改id后,相关实体不会更新

Orm 原则:在EventSubscriber(onFlush)中更改id后,相关实体不会更新,orm,doctrine,foreign-keys,auto-increment,composite-primary-key,Orm,Doctrine,Foreign Keys,Auto Increment,Composite Primary Key,我对所有条令实体使用复合主键(多租户) 示例(yaml文件): 因此,我必须手动自动增加id。所有实体的默认id均为1 示例(EventSubscriber): 到目前为止一切正常 问题: 重新计算更改集时,相关实体中的外键不会更新。例如,具有自动递增id 23的实体A已正确创建,但引用A的实体B仍返回引用id 1而不是id 23 $entityA = new A(); $entityA->setValue('foo'); $entityB = new B(); $entityB->

我对所有条令实体使用复合主键(多租户)

示例(yaml文件):

因此,我必须手动自动增加id。所有实体的默认id均为1

示例(EventSubscriber):

到目前为止一切正常

问题:

重新计算更改集时,相关实体中的外键不会更新。例如,具有自动递增id 23的实体A已正确创建,但引用A的实体B仍返回引用id 1而不是id 23

$entityA = new A();
$entityA->setValue('foo');
$entityB = new B();
$entityB->setValue('bar');
$entityB->setA($entityA);
$em->persist($entityA);
$em->persist($entityB);
$em->flush();

echo $entityA->getId(); // Returns 23
echo $entityB->getA()->getId() // Returns 1 instead of 23
当然,我可以更新EventSubscriber中的entityB,但是我需要一个通用的解决方案,因为有很多实体具有不同的关系

也许有人知道如何“重新计算”/“刷新”相关实体

class MultitenantEventSubscriber implements EventSubscriber
{

    public function getSubscribedEvents()
    {
        return [
            'onFlush'
        ];
    }

    public function onFlush(OnFlushEventArgs $event)
    {
        $em = $event->getEntityManager();
        $uow = $em->getUnitOfWork();

        foreach ($uow->getScheduledEntityInsertions() as $entity) {
            if ($entity instanceof AutoIncrementInterface) {
                $maxId = $em
                    ->createQueryBuilder('e')
                    ->select('MAX(e.id)')
                    ->from(get_class($entity), 'e')
                    ->getQuery()
                    ->getSingleScalarResult();

                if ($maxId > 1) {
                    $entity->setId($maxId + 1);
                    $md = $em->getClassMetadata(get_class($entity));
                    $uow->recomputeSingleEntityChangeSet($md, $entity);
                }
            }
        }
    }

}
$entityA = new A();
$entityA->setValue('foo');
$entityB = new B();
$entityB->setValue('bar');
$entityB->setA($entityA);
$em->persist($entityA);
$em->persist($entityB);
$em->flush();

echo $entityA->getId(); // Returns 23
echo $entityB->getA()->getId() // Returns 1 instead of 23