在Symfony2中使用Doctrine,我需要恢复每个项目,并为每个项目恢复其报告的最新时间戳。 所以我想使用DQL执行一个查询,这在SQL中就像这样:
SELECT * from `item` i
LEFT JOIN `kit` k ON k.`id` = i.`kit_id`
LEFT JOIN
(SELECT e.`item_id`, MAX(e.`dateCreation`)
FROM `entete_rapport` e
GROUP BY e.`item_id`) latest ON latest.`item_id` = i.`id`
我无法与DQL相同。我想我必须将子查询和主要的子查询分开,如下所示:
$subSelect->select('e AS ItemId, MAX(e.dateCreation) AS latest')
->from('CATUParkBundle:EnteteRapport', 'e')
->groupBy('e.item');
$qb->select('i')
->from('CATUParkBundle:Item', 'i')
->leftJoin('i.kit', 'k')
->leftJoin('CATUParkBundle:EnteteRapport f', sprintf('(%s)', $subSelect->getDQL()), 'latest', 'f.id = latest.ItemId');
我无法使这个查询起作用,我真的需要你们。 提前谢谢你,真棒!
答案 0 :(得分:0)
似乎是联接do not work in dql中的子查询。 (我收到错误消息:[Semantical Error] line 0, col 52 near '(SELECT e': Error: Class '(' is not defined.
)
您可以运行$em->getConnection()->prepare($yourRawSql)->execute()->fetchAll()
,但这会返回一个原始结果数组(没有对象)。见raw sql queries on knp-lab
或者使用HAVING而不是子查询连接在dql中执行:
$qb->select('i', 'i')
->addSelect('MAX(e.dateCreation)', 'date')
->from('CATUParkBundle:Item', 'i')
->leftJoin('i.kit', 'k')
->leftJoin('i.rapportOrWhatEver', 'f')
->groupBy('e.id');