Я работаю над проектом Symfony 3.4.
Я хочу заказать стол по updated_at, если он существует (не null), по created_at, если нет.
В SQL это работает:
SELECT * FROM `contract`
ORDER BY
(CASE WHEN ISNULL(`updated_at`) THEN `created_at` ELSE `updated_at` END)
DESC
Я много чего пробовал, но мне не удается заставить его работать с Doctrine Query Builder.
Сначала я попробовал это (синтаксическая ошибка):
$contracts = $em->createQuery(
'SELECT c
FROM AppBundle:Contract c
ORDER BY (CASE WHEN c.updatedAt = :update THEN c.createdAt ELSE c.updatedAt END) DESC')
->setParameter('update', NULL)
->getResult();
Затем я попробовал это в соответствии с Эта тема, но у меня нет результата (нет ошибки):
$contracts = $rp->createQueryBuilder('c')
->select('(CASE WHEN c.updatedAt != :update THEN 1 ELSE 0 END) AS HIDDEN orderDate')
->orderBy('orderDate', 'DESC')
->addOrderBy('c.createdAt', 'DESC')
->setParameter('update', NULL)
->getQuery()->getResult();
Как я могу отсортировать свои контракты по дате обновления, если они были обновлены, или по дате создания, если они не были изменены?
Если это поможет, я использую Пакет DoctrineExtensions для других запросов, я видел классы IfNull и IfElse, но не знаю, как их использовать в моем случае.






После нескольких попыток я наконец нашел решение.
Использовать COALESCE: возвращает первое ненулевое значение в списке, поэтому, если A равно нулю, а B не равно нулю, COALESCE(A,B) вернет B.
$contracts = $rp->createQueryBuilder('c')
->select('c')
->addSelect('COALESCE(c.updatedAt,c.createdAt) AS HIDDEN orderDate')
->orderBy('orderDate', 'DESC')
->getQuery()->getResult();
Нет необходимости использовать пакет DoctrineExtensions.