【问题标题】:Optimize doctrine find and update code优化学说查找和更新代码
【发布时间】:2014-06-24 14:36:57
【问题描述】:

目前,这是我通过查找和更新更新选定行的方式。

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 个数据库操作(查找和更新)。

上面的代码有什么办法优化吗?

【问题讨论】:

  • 你会在这里找到答案:stackoverflow.com/questions/4337751/…
  • 对我来说确实感觉不错,你需要从数据库中提取实体然后更新它,如果它存在的话,这会让你在找不到实体时有特定的行为。在“一种学说方式”中,我不认为这段代码可以优化。如果您需要,您仍然可以根据您的条件直接处理an update query

标签: php symfony doctrine-orm


【解决方案1】:

正如人们在 cmets 中提到的那样,这是正确的。

如果您没有对该对象的引用,首先要做的是检索它。

将其拆分为两部分可能会更好,因为如果在检索时发生某些事情,则更容易调试或修复此问题。

一个小技巧,当更新一个已经存在的实体时,已经存在的意思是数据库中的东西,你不应该调用 $entity_manager->persist($car)。

persist 方法让 Doctrine 知道它应该跟踪这个实体,但是因为它已经在数据库中,Doctrine 知道它,所以当任何属性发生变化时它会自动更新它。

长话短说,跟注同花就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2023-03-14
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多