Symfony 优化级联连接查询生成器

Symfony 优化级联连接查询生成器,symfony,doctrine-orm,doctrine,symfony4,query-builder,Symfony,Doctrine Orm,Doctrine,Symfony4,Query Builder,我有一个QueryBuilder查询,正在运行,但非常贪婪。我想知道我是否可以优化它 这是我的实体设置: 我有n(一打)个项目(p),有n(可以是数千)个媒体(m),有1个转录(t),有n(可以是数千)个转录日志(l) 我想检索所有项目,按其最后的转录日志(createdAt属性)排序。我想有一些方法可以优化它,但我无法找到自己的方法 return $this->createQueryBuilder('p') ->select('p') -&g

我有一个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();

谢谢

如果您对查询本身提出疑问,我看不出您可以如何对其进行更优化

但是,您可以优化其他代码使用它的方式。您可以通过向查询中添加一些
SELECT
来完成此操作。这样,当您在控制器或细枝中循环数据时,条令将有一个分组查询,而不是多个查询

这是您实现此目标的方法:

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()
;