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

sca*_*del 1 doctrine symfony doctrine-orm

我正在 Symfony2 中处理一个遗留项目,其中实体的映射没有正确定义,但我不想接触它们......

我得到了一个具有多个 ManyToOne 关系的实体,但没有在这些关联上定义级联持久性。而且关联的实体也有关系,等等(项目挺大的)……

所以,当我需要向数据库写入一个新实体时,我通常使用合并来避免持久化所有相关实体:

$myObject = new Object();
...
$em->merge($myObject);
$em->flush();
Run Code Online (Sandbox Code Playgroud)

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

我知道通过坚持,我可以做到:

$em->persist($object);
$em->flush();
$id = $object->getId();
Run Code Online (Sandbox Code Playgroud)

但是我该怎么做合并呢?显然这行不通:

$em->merge($object);
$em->flush();
$id = $object->getId(); // $id is null... 
Run Code Online (Sandbox Code Playgroud)

谢谢。

Noé*_*aün 6

来自Doctrine 文档

如果 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();
Run Code Online (Sandbox Code Playgroud)