【发布时间】:2014-11-20 01:28:30
【问题描述】:
作为described in a related question,我有一个ViewVersion 实体,其中包含给定View 的多个版本。如果我想根据最后修改的版本获取“最佳”viewVersions 列表,您可以不执行GROUP BY viewId,因为您无法控制这些返回的顺序(例如 timeMod DESC )。因此,经过几天的搜索,我相信最好的方法是通过一个简单的 INNER JOIN 来匹配最高 timeMod。
这在 MySQL 中非常有效,但是在 Doctrine 中你怎么能做到呢?
原生 MySQL 查询
SELECT view_version.*
FROM view_version
#inner join only returns where the result sets overlap, i.e. the one record with highest timeMod
INNER JOIN (
SELECT MAX(timeMod) maxTimeMod, viewId
FROM view_version
GROUP BY viewId
) version ON version.viewId = view_version.viewId AND view_version.timeMod = version.maxTimeMod
#join other tables for filter, etc
INNER JOIN view ON view.id = view_version.viewId
INNER JOIN content_type ON content_type.id = view.contentTypeId
WHERE view_version.siteId=1
AND view.contentTypeId IN (2)
ORDER BY view_version.title ASC
问题
如何使用 QueryBuilder 或 DQL(或者如果绝对必要的话 Native)形成一个 Doctrine 查询以将一个实体加入到它自己。
每次我尝试时,INNER JOIN 都会像这样抱怨 SELECT 语句:
QueryException: [Semantical Error] line 0, col 72 near '(SELECT': Error: Class '(' is not defined
注意:这与我最初的问题不同,因为它专门针对将实体与自身连接起来。
【问题讨论】:
标签: mysql symfony doctrine-orm doctrine