使用 Symfony Doctrine 从 2 个表中查询平均值

Querying average value from 2 tables with Symfony Doctrine

我正在使用 Symfony 2.6 和 Doctrine 作为 ORM。该项目在 Apache + MySQL.

上 运行

我的数据库中有 2 个实体:图书和评级。我正在构建一个系统,用户可以在其中对书籍进行评分,评分范围为 0 到 100。

我的实体:

每本书可以有多个评分,但一个评分只能与一本书相关(一对多映射)。

我的目标是获得按平均评分排序的前 5 本书。

示例:

我已经尝试使用两个实体的双 for 循环来获得结果,但根据 Symfony 分析器,它花费了 3.7 秒并需要 1001 次查询,这是非常低效的。我非常确定可以使用 DQL 以更好的方式完成它,所以...

实现我的目标的最有效方法是什么(如果可能,在单个查询中)?

编辑

感谢 MikO 在正确的方向上的推动。需要在 FROM 和 JOIN 语句中写入完整的实体(如 AcmeBundle:Book)才能正常工作。此外,您不能在查询构建器中使用 LIMIT,因此在构建查询之后和调用结果之前,我不得不使用 setMaxResults(5) 以便仅检索前 5 本书。

我还没有真正尝试过这个,但是我会为你的 Book 实体创建一个 custom repository class,然后我会在里面写这样的东西:

public function getTopRatedBooks()
{
    $em = $this->getEntityManager();

    $query = $em->createQuery('
      SELECT book.id, book.name, AVG(rating.score) as avg_rating
      FROM book 
      JOIN rating
      WHERE book.id = rating.book_id
      GROUP BY book.id
      ORDER BY avg_rating DESC
    ');

    $result = $query->getResult();

    return $result;
}