Внутреннее соединение построителя запросов Doctrine с подвыборкой - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть этот запрос в SQL, который работает нормально:

SELECT tl.*
FROM table1 tl
INNER JOIN table2 tl2
ON tl.id = tl2.other_id
INNER JOIN
(
   SELECT other_id, MAX(date) maxDATE
   FROM table2
   GROUP BY other_id
) 
tlv2 ON tl2.other_id = tlv2.other_id AND
tl2.date = tlv2.maxDATE WHERE tl.access=0
ORDER BY tlv2.maxDATE DESC

Теперь проблема в том, что я не могу понять, как перевести это в обработчик запросов Doctrine.

Iесть это:

$subquery = $this->getEntityManager()->getRepository(Table2::class)
    ->createQueryBuilder('tl2')
    ->select(array('other_id','MAX(date) maxDate'))
    ->groupBy('other_id')
    ->getDQL();
    $qb = $this->createQueryBuilder('tl');
    $qb->select('tl')
       ->innerJoin(Table2::class,'tl2','WITH','tl.id = tl2.other_id')
       ->innerJoin("(".$subquery.")",'tlv2','WITH','tl2.date = tlv2.maxDATE')
       ->where('tl.access = 0')
       ->orderBy('tlv2.maxDATE','DESC');

но это дает мне ошибку:

Subquery is not supported here

На строке, где я положил переменную $subquery.

Кажется, я не могу понять, что я делаю здесь неправильно.Что я делаю не так?

1 Ответ

0 голосов
/ 20 июня 2019

как уже упоминалось здесь если вы используете ORM, тогда сопоставление не удастся, вы можете запустить его только без гидратации, в случае, если вы используете DBAL, только это будет работать каквы ожидаете

Если вы захотите использовать собственное решение для запросов и вам все еще нужен сопоставленный результат, вы можете использовать \Doctrine\ORM\EntityManager::createNativeQuery с \Doctrine\ORM\Query\ResultSetMapping

$sql = <<<SQL
    SELECT tl.*
    FROM table1 tl
    INNER JOIN table2 tl2
    ON tl.id = tl2.other_id
    INNER JOIN
    (
       SELECT other_id, MAX(date) maxDATE
       FROM table2
       GROUP BY other_id
    ) 
    tlv2 ON tl2.other_id = tlv2.other_id AND
    tl2.date = tlv2.maxDATE WHERE tl.access=0
    ORDER BY tlv2.maxDATE DESC
SQL;


$rsm = new Query\ResultSetMapping();
$rsm->addEntityResult(Entity::class, 'e');
$rsm->addFieldResult('e','id', 'id');
$rsm->addFieldResult('e','date', 'createAt');

$result = $this->entityManager->createNativeQuery($sql, $rsm)->getResult();
...