首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony3 3-原则:逐例订购

Symfony3 3-原则:逐例订购
EN

Stack Overflow用户
提问于 2018-11-27 10:37:26
回答 1查看 956关注 0票数 0

我正在做一个Symfony 3.4项目。

如果存在( null),我希望按updated_at排序一个表,如果不存在,则按created_at排序。

在SQL中,这起作用是:

代码语言:javascript
复制
SELECT * FROM `contract`
ORDER BY
  (CASE WHEN ISNULL(`updated_at`) THEN `created_at` ELSE `updated_at` END)
DESC 

我尝试了很多东西,但我没有设法使它与一起工作。

首先,我尝试了这个(语法错误):

代码语言:javascript
复制
$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();

然后,我根据本题尝试了一下,但是没有结果(没有错误):

代码语言:javascript
复制
$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丛,我看到了IfNullIfElse类,但是我不知道如何在我的案例中使用它们。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-27 14:58:15

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

使用COALESCE:返回列表中的第一个值null,因此如果A为null,B为null,则COALESCE(A,B)将返回B。

代码语言:javascript
复制
$contracts = $rp->createQueryBuilder('c')
  ->select('c')
  ->addSelect('COALESCE(c.updatedAt,c.createdAt) AS HIDDEN orderDate')
  ->orderBy('orderDate', 'DESC')
  ->getQuery()->getResult();

不需要使用DoctrineExtensions包。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53497755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档