优化级联接头QueryBuilder

问题描述

我有一个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来实现。这样,当您在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()
;