使用Doctrine DQL加入子查询

时间:2016-11-15 19:05:34

标签: symfony doctrine dql

在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');

我无法使这个查询起作用,我真的需要你们。 提前谢谢你,真棒!

1 个答案:

答案 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');