ВНУТРЕННЕЕ СОЕДИНЕНИЕ Результаты из оператора Select с помощью Doctrine QueryBuilder

Можете ли вы использовать Doctrine QueryBuilder дляINNER JOIN временная таблица с полнойSELECT заявление, которое включает в себяGROUP BY?

Конечная цель - выбрать лучший вариант записи. У меня есть таблица viewVersion, которая имеет несколько версий с одинаковым значением viewId, но с разным timeMod. Я хочу найти версию с последним timeMod (и сделать много других сложных объединений и фильтров по запросу).

Первоначально люди предполагают, что вы можете сделатьGROUP BY viewId а потомORDER BY timeMod, но ORDER BY не влияет на GROUP BY, и MySQL будет возвращать случайные результаты. Существует множество ответов (например,Вот), которые объясняют проблему с использованием GROUP и предлагают решение, но у меня возникают проблемы с интерпретацией документов Doctrine, чтобы найти способ реализовать SQL с помощью Doctrine QueryBuilder (если это возможно). Почему бы мне просто не использовать DQL? Возможно, мне придется, но у меня есть много динамических фильтров и объединений, которые намного проще сделать с QueryBuilder, поэтому я хотел посмотреть, возможно ли это.

Пример MySQL для воспроизведения в Doctrine QueryBuilder
SELECT vv.* 
FROM view_version vv
#inner join only returns where the result sets overlap, i.e. one record
INNER JOIN (
    SELECT MAX(timeMod) maxTimeMod, viewId
    FROM view_version
    GROUP BY viewId
) version ON version.viewId = vv.viewId AND vv.timeMod = version.maxTimeMod
#join other tables for filter, etc
INNER JOIN view v ON v.id = vv.viewId
INNER JOIN content_type c ON c.id = v.contentTypeId
WHERE vv.siteId=1
AND v.contentTypeId IN (2)
ORDER BY vv.title ASC;
Теоретическое решение с помощью Query Builder (не работает)

Я думаю, что JOIN необходимо ввести оператор DQL, например,

$em = $this->getDoctrine()->getManager();
$viewVersionRepo = $em->getRepository('GutensiteCmsBundle:View\ViewVersion');

$queryMax = $viewVersionRepo->createQueryBuilder()
    ->addSelect('MAX(timeMod) AS timeModMax')
    ->addSelect('viewId')
    ->groupBy('viewId');

$queryBuilder = $viewVersionRepo->createQueryBuilder('vv')
    // I tried putting the query in a parenthesis, to no avail
    ->join('('.$queryMax->getDQL().')', 'version', 'WITH', 'vv.viewId = version.viewId AND vv.timeMod = version.timeModMax')
    // Join other Entities
    ->join('e.view', 'view')
    ->addSelect('view')
    ->join('view.contentType', 'contentType')
    ->addSelect('contentType')
    // Perform random filters
    ->andWhere('vv.siteId = :siteId')->setParameter('siteId', 1)
    ->andWhere('view.contentTypeId IN(:contentTypeId)')->setParameter('contentTypeId', $contentTypeIds)
    ->addOrderBy('e.title', 'ASC');

$query = $queryBuilder->getQuery();
$results = $query->getResult();

Мой код (который может не полностью соответствовать приведенному выше примеру) выводит:

SELECT e, view, contentType 
FROM Gutensite\CmsBundle\Entity\View\ViewVersion e 
INNER JOIN (
    SELECT MAX(v.timeMod) AS timeModMax, v.viewId 
    FROM Gutensite\CmsBundle\Entity\View\ViewVersion v 
    GROUP BY v.viewId
) version WITH vv.viewId = version.viewId AND vv.timeMod = version.timeModMax 
INNER JOIN e.view view 
INNER JOIN view.contentType contentType 
WHERE e.siteId = :siteId 
AND view.contentTypeId IN (:contentTypeId) 
ORDER BY e.title ASC

Этот ответ кажется, указывает на то, что это возможно в других контекстах, таких какIN заявления, но когда я пытаюсь вышеупомянутый метод в JOIN, я получаю ошибку:

[Semantical Error] line 0, col 90 near '(SELECT MAX(v.timeMod)': Error: Class '(' is not defined.

Ответы на вопрос(1)

Ваш ответ на вопрос