我正在研究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...
感谢。
答案 0 :(得分:4)
如果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();
如果有人有更好的解决方案,请发布!