我正在做一个Symfony 3.4项目。
如果存在( null),我希望按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类,但是我不知道如何在我的案例中使用它们。
发布于 2018-11-27 14:58:15
经过几次尝试,我终于找到了解决办法。
使用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包。
https://stackoverflow.com/questions/53497755
复制相似问题