【问题标题】:Symfony3-Doctrine : Order by Case WhenSymfony3-Doctrine : 按情况排序
【发布时间】:2018-11-27 10:37:26
【问题描述】:

我正在开发一个 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();

然后,我按照this topic尝试了这个,但是我没有结果(没有错误):

$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 bundle 用于其他查询,我看到了 IfNullIfElse 类,但我不知道如何在我的案例中使用它们。

【问题讨论】:

    标签: mysql doctrine-orm sql-order-by symfony-3.4 doctrine-query


    【解决方案1】:

    经过多次尝试,我终于找到了解决办法。

    使用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 包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多