Symfony3-Doctrine: порядок в каждом случае, когда
Я работаю над проектом Symfony 3.4.
Я хочу заказать столик по updated_at
если существует (не ноль), 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
классы, но я не знаю, как их использовать в моем случае.
1 ответ
После нескольких попыток я наконец нашел решение.
использование COALESCE
: возвращает первое значение, отличное от NULL в списке, поэтому, если A равно NULL, а B не NULL, то COALESCE(A,B)
вернет Б.
$contracts = $rp->createQueryBuilder('c')
->select('c')
->addSelect('COALESCE(c.updatedAt,c.createdAt) AS HIDDEN orderDate')
->orderBy('orderDate', 'DESC')
->getQuery()->getResult();
Нет необходимости использовать пакет DoctrineExtensions.