【问题标题】:optimize cascade jointure QueryBuilder优化级联连接 QueryBuilder
【发布时间】:2020-10-14 08:48:25
【问题描述】:

我有一个 QueryBuilder 查询,工作正常,但非常贪婪。我想知道我是否可以优化它。

这是我的实体设置: 我有 n(十)个项目(p),有 n(可能是数千)个媒体(m),有 1 个转录(t),有 n(可能是数千)个转录日志(l)。

我想检索所有项目,按其最后的转录日志(createdAt 属性)排序。我想有一些方法可以优化它,但我无法弄清楚自己的。

return $this->createQueryBuilder('p')
          ->select('p')
          ->leftJoin('p.medias', 'm')
          ->leftJoin('m.transcription', 't')
          ->leftJoin('t.transcriptionLogs', 'l')
          ->andWhere('p.archived = 0')
          ->addOrderBy('l.createdAt', 'DESC')
          ->addOrderBy('p.id', 'DESC')
          ->getQuery()
          ->getResult();

谢谢!

【问题讨论】:

    标签: symfony doctrine-orm doctrine symfony4 query-builder


    【解决方案1】:

    如果您质疑查询本身,我看不出您如何进一步优化它。

    但是,您可以优化其他代码使用它的方式。您可以通过在查询中添加一些 SELECT 来做到这一点。这样,当您在 Controller 或 Twig 中循环数据时,Doctrine 将有一个分组查询而不是多个查询。

    这就是你可以实现的方法:

    return $this->createQueryBuilder('p') 
          ->leftJoin('p.medias', 'm')
    
          // Joining the transcription and adding the select
          ->leftJoin('m.transcription', 't')
          ->addSelect('t')
    
          // And doing the same for the logs
          ->leftJoin('t.transcriptionLogs', 'l')
          ->addSelect('l')
    
          ->andWhere('p.archived = 0')
          ->addOrderBy('l.createdAt', 'DESC')
          ->addOrderBy('p.id', 'DESC')
          ->getQuery()
          ->getResult()
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      相关资源
      最近更新 更多