Symfony3-Doctrine:按案例排序
Symfony3-Doctrine : Order by Case When
我正在做一个 Symfony 3.4 项目。
如果存在(不为空),我想通过 updated_at
订购 table,如果不存在,则通过 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 用于其他查询,我看到 IfNull
和 IfElse
类 但我不知道如何将它们用于我的查询案例.
经过多次尝试,终于找到了解决办法。
使用COALESCE
:return是列表中第一个不为空的值,因此如果A为空且B不为空,则COALESCE(A,B)
将return B .
$contracts = $rp->createQueryBuilder('c')
->select('c')
->addSelect('COALESCE(c.updatedAt,c.createdAt) AS HIDDEN orderDate')
->orderBy('orderDate', 'DESC')
->getQuery()->getResult();
无需使用 DoctrineExtensions 包。
我正在做一个 Symfony 3.4 项目。
如果存在(不为空),我想通过 updated_at
订购 table,如果不存在,则通过 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 用于其他查询,我看到 IfNull
和 IfElse
类 但我不知道如何将它们用于我的查询案例.
经过多次尝试,终于找到了解决办法。
使用COALESCE
:return是列表中第一个不为空的值,因此如果A为空且B不为空,则COALESCE(A,B)
将return B .
$contracts = $rp->createQueryBuilder('c')
->select('c')
->addSelect('COALESCE(c.updatedAt,c.createdAt) AS HIDDEN orderDate')
->orderBy('orderDate', 'DESC')
->getQuery()->getResult();
无需使用 DoctrineExtensions 包。