Doctrine:合并后如何获取自动生成的id?

时间:2017-06-08 15:08:20

标签: symfony doctrine-orm doctrine

我正在研究Symfony2中的遗留项目,其中实体的映射未正确定义,但我不想触摸它们......

我有一个具有多个ManyToOne关系的实体,但是没有在这些关联上定义级联持久性。关联实体也有关系,等等(项目很大)......

因此,当我需要将新实体写入数据库时​​,我通常使用merge来避免持久化所有相关实体:

$myObject = new Object();
...
$em->merge($myObject);
$em->flush();

但是这一次,我需要获取插入对象的id。这个id是由Doctrine自动生成的(我也不想改变它)。

我知道,坚持下去,我能做到:

$em->persist($object);
$em->flush();
$id = $object->getId();

但我怎么能合并?显然这不起作用:

$em->merge($object);
$em->flush();
$id = $object->getId(); // $id is null... 

感谢。

2 个答案:

答案 0 :(得分:4)

来自Doctrine documentation

  

如果X是分离实体,则X的状态将复制到相同标识的预先存在的托管实体实例X'。

如果您未提供要合并的实体的ID,则Doctrine无法将其与数据库中显示的现有实体合并。

如果您始终想要创建新实体,则可以使用persist代替merge,并在您的实体中使用getId()

如果您真的想使用merge() ...

  

如果X是新的实体实例,将创建新的托管副本X',并将X的状态复制到此托管实例上。

因此,您必须使用合并返回的新持久化实体。

$myDetachedObject = new Object();
// ...
$myAttachedObject = $em->merge($myDetachedObject);
$em->flush();

// $id = $myDetachedObject->getId(); // --> this won't work
$id = $myAttachedObject->getId();

答案 1 :(得分:0)

好的,所以我结束了:

$myObject = new Object();
...
$em->merge($myObject);
$em->flush();

// Get back object from db (merge doesn't give access to auto-generated id)
$query = $this->getDoctrine()
    ->getRepository('MyBundle:Object')
    ->createQueryBuilder('o')
    ->orderBy('o.id', 'DESC')
    ->getQuery();
$object = $query->setMaxResults(1)->getOneOrNullResult();

$id = $object->getId();

如果有人有更好的解决方案,请发布!