Symfony3原则:按情况排序



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

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

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

相关内容

  • 没有找到相关文章

最新更新