symfony3原则:按案例排序

7lrncoxx  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(355)

我在做一个symfony3.4项目。
我想订一张table updated_at 如果存在(不为空),则按 created_at 如果没有。
在sql中,这是有效的:

SELECT * FROM `contract`
ORDER BY
  (CASE WHEN ISNULL(`updated_at`) THEN `created_at` ELSE `updated_at` END)
DESC

我尝试了很多东西,但我没有设法使它与条令查询建设者的工作。
首先,我尝试了以下方法(语法错误):

$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 但我不知道如何在我的案例中使用它们。

esyap4oy

esyap4oy1#

经过几次尝试,我终于找到了解决办法。
使用 COALESCE :返回列表中第一个不为null的值,因此如果a为null,b为not 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包。

相关问题