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

时间:2015-04-07 22:00:54

标签: php mysql symfony doctrine-orm dql

首先,如果我的英语不太好,请原谅。

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

我的数据库中有2个实体:书籍和评级。我正在构建一个系统,用户可以将书籍从0到100评级。

我的实体:

  • 书籍:id,其他不相关的字段
  • 评分:id,book_id,得分,其他无关字段

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

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

示例:

  • 书1:94.5
  • 第2册:93.3
  • 书3:89.2
  • 书4:85.2
  • 书5:79.6

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

¿这可能是实现目标的最有效方式(如果可能,只需一次查询)?

提前致谢。

修改

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

非常感谢。

1 个答案:

答案 0 :(得分:0)

我还没有尝试过这个,但是我为你的Book实体创建了一个custom repository class,然后我会在其中写下这样的内容:< / p>

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;
}