Symfony3-Doctrine: порядок в каждом случае, когда - PullRequest
0 голосов
/ 27 ноября 2018

Я работаю над проектом 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 Ответ

0 голосов
/ 27 ноября 2018

После нескольких попыток я наконец нашел решение.

Использовать COALESCE: возвращает первое значение в списке, отличное от NULL, поэтому, если A равно NULL и B не NULL, то 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.

...