在使用查询构建器更新后,我有一个简单的问题,将什么附加到已加载的实体中,似乎它们是"不同步的"。
以下代码显示问题
/** @var EntityManager $em */
$repository = new PersonneRepository();
/** @var Personne $persone */
$persone = $repository->find('42');
echo 'SEXE : ' . $persone->getSexe() . "n";
$invertedSexe = $persone->getSexe() == 'F' ? 'M' : 'F';
echo 'New Sexe : '.$invertedSexe."n";
$q = $em->createQueryBuilder();
$q->update($repository->getClassName(), 'p')
->set('p.sexe', ":sexe")
->where('p.id = :id')
->setParameters(array(
'sexe' => $invertedSexe,
'id' => $persone->getId()
));
$q->getQuery()->execute();
echo 'SEXE : ' . $persone->getSexe() . "n";
$persone = $repository->find('42');
echo 'SEXE : ' . $persone->getSexe() . "n";
输出:
SEXE : M
New Sexe : F
SEXE : M
SEXE : M
因为您没有更新$persone对象,而只是更新数据库。
所以要么你去
- ORM方式,这意味着您
$persone->setSexe()
然后刷新它
这可能看起来像例如:
/** @var EntityManager $em */
$repository = new PersonneRepository();
/** @var Personne $persone */
$persone = $repository->find('42');
echo 'SEXE : ' . $persone->getSexe() . "n";
$invertedSexe = $persone->getSexe() == 'F' ? 'M' : 'F';
echo 'New Sexe : '.$invertedSexe."n";
$persone->setSexe($invertedSexe);
$em->persist($persone);
$em->flush();
echo 'SEXE : ' . $persone->getSexe() . "n";
$persone = $repository->find('42');
echo 'SEXE : ' . $persone->getSexe() . "n";
- DBAL 方式,这意味着您首先更新您的数据库,然后再次刷新您的$person(
find
它仍然会让您获得对象而不是更新的数据库实体(或手动设置您的 $persone->sexe。
选项 2 中提到的刷新在代码中完成,如下所示:
$em->refresh($persone); // instead of your last $respository->find('42');
答案在文档中:
DQL UPDATE 语句直接移植到数据库更新中 语句,因此绕过任何锁定方案,事件和不 递增版本列。已加载到的实体 持久性上下文将不会与更新的数据库同步 州。建议调用 EntityManager#clear(( 并检索 任何受影响实体的新实例。
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#update-queries