【发布时间】:2015-06-12 16:09:28
【问题描述】:
我使用 Symfony 2.6 和 Doctrine 作为 ORM。该项目在 Apache + MySQL 上运行。
我的数据库中有 2 个实体:图书和评级。我正在构建一个系统,用户可以在其中对书籍从 0 到 100 进行评分。
我的实体:
- 书籍:id,其他不相关的字段
- 评分:id、book_id、score、其他不相关的字段
每本书可以有多个评分,但评分只能与一本书相关(一对多映射)。
我的目标是按平均评分排序前 5 本书。
例子:
- 书 1:94.5
- 书 2:93.3
- 书 3:89.2
- 书 4:85.2
- 书 5:79.6
我已经尝试使用两个实体的双循环来获得结果,但是根据 Symfony 分析器,它需要 3.7 秒并且需要 1001 次查询,这是非常低效的。我很确定可以使用 DQL 以更好的方式完成,所以...
实现我的目标最有效的方法是什么(如果可能在单个查询中)?
编辑
感谢 MikO 朝着正确的方向前进。需要在 FROM 和 JOIN 语句中编写完整的实体(如 AcmeBundle:Book)才能使其工作。此外,您不能在查询构建器中使用 LIMIT,因此在构建查询之后调用结果之前,我必须使用 setMaxResults(5) 才能仅检索前 5 本书。
【问题讨论】:
标签: php mysql symfony doctrine-orm dql