onFlush监听器,获取预定实体插入的实体ID

时间:2016-09-29 09:51:42

标签: symfony events doctrine

我有 onFlush 事件的监听器。

public function onFlush(OnFlushEventArgs $args) {
   $em = $args->getEntityManager();
   $uow = $em->getUnitOfWork();
   foreach ($uow->getScheduledEntityInsertions() as $entity) {
     $id = ...
   }
}

我想获得$实体的ID。如果我调用getId()然后返回null。有没有办法在这个监听器内完成刷新并得到$ entity的Id?

谢谢你提前

1 个答案:

答案 0 :(得分:0)

不可能在执行SQL INSERT命令之前访问ID,但是您可以通过以下一些棘手的方式访问MySQL表的自动增量值:

$classMeta = $em->getClassMetadata($className);
if ($classMeta->rootEntityName !== $className) {
    // if the Entity is inherited, only root entity table may have auto increment ID
    $classMeta = $em->getClassMetadata($classMeta->rootEntityName);
}
$tableName = $classMeta->getTableName();

$conn = $em->getConnection();
$stmt = $conn->prepare("SHOW TABLE STATUS LIKE '".$tableName."'");
$stmt->execute();
$result = $stmt->fetch(\PDO::FETCH_ASSOC);
$id = $result['Auto_increment'];

请注意使用以下方法:

  • 此解决方案存在漏洞,自动递增值可能与插入的ID不同
  • 您的MySQL用户必须具有运行此SQL命令的权限