有没有办法在persist / flush之前获取实体ID?我的意思是:
$entity = new PointData();
$form = $this->createForm(new PointDataType(), $entity);
如果我此时尝试$ entity-> getId(),它什么都不返回。
我可以通过以下方式获得它:
$em->persist($entity);
$em->flush();
(假设$ em = $ this-> getDoctrine() - > getEntityManager();)
我怎样才能做到这一点?
如果您想在将实体持久化到数据库之前知道该实体的ID,那么您显然无法使用生成的标识符。您需要找到一些方法来自己生成唯一标识符(也许某种哈希函数可以生成唯一足够的值)。
但这不是一个好主意,所以你应该小心。
我会非常仔细地考虑为什么我需要在刷新之前知道标识符。 Doctrine非常善于让你构建一个大对象图,并立即持久/冲洗它。看起来很可能你的架构中有一些丑陋的东西正在试图解决。在关闭应用程序生成的id路由之前,最好先查看一下。
您可以使用@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.
}
...
}
您可以使用自动生成ID来获取通用唯一标识符(UUID)等密钥,也可以使用symfony的事件:postFlush - 在刷新操作结束时发生postFlush事件。