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.

Другие вопросы по тегам