目前,这是我如何更新选定行的方式,通过查找&更新。
private function turnOnLight($entity_manager, $model, $year)
{
// Is this an optimized way to update a single column?
// It seems not as we need 2 rounds DB communication trip.
$car = $entity_manager->findOneBy(array(
'model' => $model,
'year' => $year,
'light' => 0
));
if (is_null($car)) {
return;
}
$car->light = 1;
$entity_manager->persist($car);
$entity_manager->flush();
}
然而,我不觉得这是足够有效的,因为它需要2 DB操作(找到&更新)。
有没有办法优化上面的代码?
正如人们在评论中提到的,这是正确的。
如果没有对象的引用,首先要做的就是检索this。
最好将其分成两个,因为如果检索时发生了什么,则更容易调试或修复此问题。
一个小提示,当更新一个已经存在的实体时,这里的已经存在是指数据库中的东西,您不应该调用call $entity_manager->persist($car)。
persist方法让Doctrine知道它应该跟踪这个实体,但是因为它已经在数据库中,Doctrine知道它,所以当任何属性发生变化时,它会自动更新它。
长话短说,调用flush就足够了。