Orm 原则:在EventSubscriber(onFlush)中更改id后,相关实体不会更新
我对所有条令实体使用复合主键(多租户) 示例(yaml文件): 因此,我必须手动自动增加id。所有实体的默认id均为1 示例(EventSubscriber): 到目前为止一切正常 问题: 重新计算更改集时,相关实体中的外键不会更新。例如,具有自动递增id 23的实体A已正确创建,但引用A的实体B仍返回引用id 1而不是id 23Orm 原则:在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->
$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