Doctrine2 - 在刷新之前获取实体ID

Xav*_*avi 15 entity flush persist doctrine-orm

有没有办法在persist/flush之前获取实体ID?我的意思是:

$entity = new PointData();
$form   = $this->createForm(new PointDataType(), $entity);
Run Code Online (Sandbox Code Playgroud)

如果我此时尝试$ entity-> getId(),它什么都不返回.

我可以通过以下方式获得它:

$em->persist($entity);
$em->flush();
Run Code Online (Sandbox Code Playgroud)

(假设$ em = $ this-> getDoctrine() - > getEntityManager();)

我怎样才能做到这一点?

tim*_*dev 29

如果您想在将实体持久化到数据库之前知道该实体的ID,那么您显然无法使用生成的标识符.您需要找到一些方法来自己生成唯一标识符(也许某种哈希函数可以生成唯一足够的值).

但这不是一个好主意,所以你应该小心.

我会非常仔细地考虑为什么我需要在刷新之前知道标识符.Doctrine非常善于让你构建一个大对象图,并立即持久/冲洗它.看起来很可能你的架构中有一些丑陋的东西正在试图解决.在关闭应用程序生成的id路由之前,最好先查看一下.

  • @JorgeeFG-绝对。对于此用例,UUID非常有用。自编写此答案以来的几年中,我开始偏爱使用UUID作为实体的标识符。https://github.com/ramsey/uuid是一个非常可靠的生成它们的库,并且https://github.com/ramsey/uuid-doctrine提供了一种工作原理很好的学说类型实现。 (2认同)
  • 事实上,Ocramius 本人(Doctrine ORM 项目负责人)建议生成我们自己的 UUID,而不是依赖 Doctrine ……原因之一是这样我们就可以从实例化的那一刻起就拥有有效实体,我们也在坚持之前知道他们将拥有哪个 ID... (2认同)

Eli*_*ier 10

您可以使用@PostPersist注释.使用该方法注释的方法将在刷新终止之前执行,并且实体Id已经可用.

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/events.html

postPersist - 在实体被持久化之后,实体发生postPersist事件.它将在数据库插入操作后调用.postPersist事件中提供了生成的主键值.

<?php

use Doctrine\ORM\Mapping as ORM;

/** 
 * @ORM\Entity 
 * @ORM\HasLifecycleCallbacks 
 */
class PointData
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $id;

     ...

     /** 
      * @ORM\PostPersist 
      */
     public function onPostPersist()
     {
         // Put some simple logic here that required the auto-generated Id.
     }

     ...

}
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢对实体进行注释,这样逻辑就不会隐藏在其他地方。 (2认同)