【问题标题】:$parent->addSalle($child) generate uneeded extra query$parent->addSalle($child) 生成不需要的额外查询
【发布时间】:2019-08-23 16:01:43
【问题描述】:

我目前正在优化学说查询,并注意到学说会对其在工作单元 (UOW) 中已获得的数据生成额外的查询。

然而,当我尝试将子对象添加/关联到它的父对象时,Doctrine 正在查询以获取所有子对象(它们已经在 UOW 中)

这就是我的做法:

//Getting (root) Salle of the view
$salle=$salleRepository->findBy(array('isAccueil'=>true));

//Get '$salle' children
$salles=$salleRepository->findBy(array('salle'=>$salle));

//For each children of each `Salle` in $salle
foreach($salleRepository->findBy(array('salle'=>$salles)) as $child) {

    //Go through each parent
    foreach($salles as $parent) {

        //If parent id match child parent id
        if($parent->getId() == $child->getSalle()->getId()) {

            //Doctrine extra query happen here
            //Query for current parent's children
            $parent->addSalle($child);
        }
    }
}

正如代码注释中所写,Doctrine 查询当前父母的孩子。
但是这些孩子已经存在于 UOW 中,我确实在第一个 foreach 上查询了他们。

有没有办法将孩子与父母重新关联,这样 Doctrine 就不会做额外的查询?

【问题讨论】:

    标签: symfony doctrine symfony4


    【解决方案1】:

    您从一开始就执行这两个查询。

    Doctrine 的工作单元 (UOW) 不是结果缓存。你可能误会了。

    // FIRST
    $salles=$salleRepository->findBy(array('salle'=>$salle));
    
    // SECOND
    foreach($salleRepository->findBy(array('salle'=>$salles)) as $child) {
    

    您应该将这两个查询组合成您存储库中的一个查询。

    例子:

    // tip: don't use assignments in loop definitions and conditional statements
    $children = $salleRepository->findSalleBySallesSalle($salle);
    
    $foreach ($children as $child) {
      // ..
    }
    

    这样想:

    如果数据库在这两个查询之间发生了变化,而您真的想要两个不同的结果怎么办?

    Doctrine 允许您配置单独的查询和结果缓存,但在这里您应该只使用组合查询。

    【讨论】:

    • 不会同时更改数据库。就是这样的项目。至于你的建议。你的代码基本上就是我已经在做的事情了。我让孩子们在一个单独的实例上(除了我不使用变量来存储它们)。这里的问题是没有得到孩子。我的问题是,当我将父母和孩子联系起来时,学说正在做不必要的额外查询。如果您告诉我无论如何它都会这样做,那么我将在树枝视图中循环。我的最终目标只是计算孩子的数量。
    • 正如我所说 - 在存储库方法中使用一个组合查询。特别是如果您的目标只是计数。您也可以使用 Doctrine 直接从 SQL 获取计数。现在,您通过调用 findBy* 两次来明确要求 Doctrine 执行两个查询。
    • 如果你在谈论 $child->getSalle() 调用,在被调用时创建一个额外的查询:使用 eager loading 策略而不是默认的延迟加载。但是正如您所说,您只需要计数-> 进行单个查询。
    猜你喜欢
    • 1970-01-01
    • 2022-12-28
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2014-04-05
    相关资源
    最近更新 更多