我有一个使用 Symfony 2 并包含 Doctrine 2 实体的项目。其中一些实体彼此相关。该关联由注释定义:
/**
* @ORM\OneToMany(targetEntity="Event", mappedBy="firstEntityId" cascade={"persist", "remove"})
* @ORM\OrderBy({"dateEnd" = "DESC", "dateBegin" = "DESC"})
*/
private $events;
如您所见,此关联包含多个具有开始日期和结束日期的事件。检索此集合时,我希望首先对最近发生的事件(即尚未结束或最近结束的事件)进行排序。
当前方法的问题是它将结束日期为 NULL
的事件排在所有其他事件之后。
我如何告诉 Doctrine 先对结束日期为 NULL
的事件进行排序,然后按结束日期降序对剩余事件进行排序?
到目前为止,我已经在 SO 上看到了几个关于如何告诉 Doctrine 如何订购实体的问题。但是,他们都没有提到注释。按照建议反转符号的技巧,例如在 Doctrine 2 Order By ASC and Null values in last不起作用,因为 Doctrine 不接受除属性名称和注释中的 ASC
或 DESC
以外的任何内容。
最佳答案
这是一篇旧文章,但如果您使用的是学说查询构建器,我发现了一个非常简单的解决方案:
$sortDirection = 'ASC';
$qb = $this->createQueryBuilder('e');
$qb->addSelect('CASE WHEN e.valueToOrder IS NULL THEN 1 ELSE 0 END AS HIDDEN myValueIsNull');
//other stuffs
//$qb->where ...
$qb->orderBy('myValueIsNull','ASC');
$qb->addOrderBy('e.valueToOrder',':sortDirection');
$qb->setParameter(':sortDirection',$sortDirection);
return $qb->getQuery()->getResult();
PHP 方式,除了速度较慢之外,避免使用偏移量(例如无限滚动)
关于php - 如何使用注解在 Doctrine 2 集合上首先排序 NULL 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28852390/