通过查询生成器更新后已水合的实体的同步



在使用查询构建器更新后,我有一个简单的问题,将什么附加到已加载的实体中,似乎它们是"不同步的"。

以下代码显示问题

/** @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对象,而只是更新数据库。

所以要么你去

  1. 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";
  1. 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

相关内容

  • 没有找到相关文章

最新更新