Как использовать "отличное" с учением?
Я пытаюсь использовать "отличный от" с доктриной, но я получаю следующую ошибку:
Ошибка: ожидаемая известная функция, включена
class Report extends EntityRepository
{
public function findForList() {
$queryBuilder = $this->createQueryBuilder('r');
$queryBuilder->select('distinct on (r.parentId)')
->orderBy('r.parentId')
->orderBy('r.date', 'DESC');
return $queryBuilder->getQuery()->getResult();
}
}
Как я могу реализовать следующий запрос?
select distinct on (r.parent_id)
r.parent_id,
r.id,
r.name
from frontend.report r
order by r.parent_id, r.date desc;
По-видимому, это невозможно сделать с помощью построителя запросов. Я пытался переписать свой запрос по-разному:
select * from frontend.report r
where
r.id in (
select distinct
(select r3.id from frontend.report r3
where r3.parent_id = r.parent_id
order by r3.date desc limit 1) AS id
from frontend.report r2);
Но доктрина не поддерживает LIMIT:
public function findForList() {
$qb3 = $this->_em->createQueryBuilder();
$qb3->select('r3.id')
->from('MyBundle:frontend\report', 'r3')
->where('r3.parentId = r2.parentId')
->orderBy('r3.date', 'DESC')
//->setMaxResults(1)
;
$qb2 = $this->_em->createQueryBuilder();
$qb2->select('(' . $qb3->getDql() . ' LIMIT 1)')
->from('MyBundle:frontend\report', 'r2')
->distinct(); // groupBy('r2.parentId')
$queryBuilder = $this->createQueryBuilder('r');
$queryBuilder->where(
$queryBuilder->expr()->in('rlt.id', $qb2->getDql())
);
return $queryBuilder->getQuery()->getResult();
}
Я думаю, что единственное решение - использовать нативные SQL-запросы.
2 ответа
Этот ответ для тех, кто еще ищет решение в подобных случаях. Если вам нужен образец "DISTINCT", вы можете использовать:
$queryBuinder->select('parentId')
->distinct('parentId');
но если вы хотите "DISTINCT ON", вы должны использовать собственный SQL вместо Query Builder, ознакомьтесь с руководством здесь: Doctrine Native SQL
Просто удалите on
слово:
$queryBuilder->select('distinct r.parentId')
->orderBy('r.parentId')
->orderBy('r.date', 'DESC');