2017-01-05 2 views
0

Я пытаюсь получить последние забронированные курсы (уникальные). Я попытался следующий с QueryBuilder Doctrine:Symfony doctrine orderby и группа от (отличная)

$repository = $this->getDoctrine()->getRepository('AppBundle:Booking'); 

$query = $repository->createQueryBuilder('b') 
->select('(b.course) AS course') 
->orderBy('b.id', 'DESC') 
->groupBy('b.course') 
->setMaxResults(5) 
->getQuery(); 

без OrderBy он работает, но он будет пересекать бронирования по возрастанию. Мне нужны последние забронированные курсы. С помощью этого запроса я получаю эту ошибку:

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ... which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 500 Internal Server Error - DriverException

Я также попытался следующие:

$em = $this->getDoctrine()->getManager(); 
$query = $em->createQuery(
    'SELECT DISTINCT c.id 
    FROM AppBundle:Booking b 
    JOIN b.course c 
    ORDER BY b.id DESC' 
); 

SQLSTATE[HY000]: General error: 3065 Expression #1 of ORDER BY clause is not in SELECT list, references column ... which is not in SELECT list; this is incompatible with DISTINCT

Теперь я искал решений и в основном нашел много предложений, чтобы отключить ONLY_FULL_GROUP_BY. Disable ONLY_FULL_GROUP_BY

Некоторые комментарии указывают на то, что нецелесообразно делать это, чтобы соответствовать стандартам sql. Тогда как это возможно так, как это работает?

+0

Можете ли вы предоставить более подробную информацию о своих лицах? Как они отображаются? (Я угадываю ManyToOne однонаправленный) – OlivierC

+0

ManyToOne двунаправленный, из-за каскадного удаления, так как заказы не могут существовать без курса – DaViDa

ответ

1

Вы могли бы попробовать этот способ:

$query = $repository->createQueryBuilder('b') 
->select('(b.course) AS course') 
->leftJoin('AppBundle:Booking', 'b2', 'WITH', 'b.course = b2.course AND b.id < b2.id) 
->where('b2.id IS NULL') 
->orderBy('b.id', 'DESC') 
->setMaxResults(5) 
->getQuery(); 

Вы получите только заказы с наибольшим идентификатором для каждого курса, так что нет необходимости в группировке по курсу.

+0

Это работает спасибо! – DaViDa

+0

Как это узнать, как получить уникальные курсы? – DaViDa

+0

Левое соединение делает магию. Для каждой пары b/b2 b.id sast