Symfony Конструктор запросов (подзапрос) - PullRequest
0 голосов
/ 04 августа 2020

Как этот SQL запрос будет выглядеть в построителе запросов? К сожалению, подвыборы невозможны, верно?

SQL:

SELECT t.* FROM domain_check_result AS t
INNER JOIN (SELECT *, MAX(checkDate) AS MaxDate
FROM domain_check_result
GROUP BY domain_id) AS tm ON t.domain_id = tm.domain_id AND t.checkDate = tm.MaxDate

1 Ответ

0 голосов
/ 06 августа 2020

Чтобы выбрать последний результат из вашей группы (доменов), вы можете переписать свой запрос, как показано ниже, и было бы проще перевести этот запрос в DQL и построитель запросов

SQL

SELECT 
  a.* 
FROM
  domain_check_result a 
  LEFT JOIN domain_check_result b 
    ON a.domain_id = b.domain_id 
    AND a.checkDate < b.checkDate 
WHERE b.checkDate IS NULL 
ORDER BY a.checkDate DESC 

DQL

SELECT a 
FROM AppBundle\Entity\DomainCheckResult a
    LEFT JOIN AppBundle\Entity\DomainCheckResult b 
    WITH a.domain = b.domain 
    AND a.checkDate < b.checkDate
WHERE b.checkDate IS NULL
ORDER BY a.checkDate DESC

И в запросе вы можете перевести свой DQL как

$repo = $DM->getRepository( 'AppBundle\Entity\DomainCheckResult' );
$results = $repo->createQueryBuilder( 'a' )
                ->select( 'a' )
                ->leftJoin(
                    'AppBundle\Entity\DomainCheckResult',
                    'b',
                    'WITH',
                    'a.domain = b.domain AND a.checkDate < b.checkDate'
                )
                ->where( 'b.checkDate IS NULL' )
                ->orderBy( 'a.checkDate','DESC' )
                ->getQuery()
                ->getResult();

Ссылка: Doctrine Язык запросов получить максимальную / последнюю строку для группы

...