如何使用注释首先在Doctrine 2集合上订购NULL值?

Chr*_*ris 4 php sorting symfony doctrine-orm

我有一个使用Symfony 2并包含Doctrine 2实体的项目.其中一些实体彼此相关.此关联由注释定义:

/**
 * @ORM\OneToMany(targetEntity="Event", mappedBy="firstEntityId" cascade={"persist", "remove"})
 * @ORM\OrderBy({"dateEnd" = "DESC", "dateBegin" = "DESC"})
*/
private $events;
Run Code Online (Sandbox Code Playgroud)

如您所见,此关联包含多个具有开始和结束日期的事件.在检索此集合时,我希望最多的事件(即那些尚未结束或最近结束的事件)先排序.

当前方法的问题在于它将NULL在所有其他事件之后对结束日期进行排序.

如何告诉Doctrine以结束日期为NULL先排序事件,然后按降序结束日期对剩余事件进行排序?

到目前为止,我已经看到了几个关于如何告诉Doctrine如何订购实体的问题.但是,他们都没有提到注释.例如在Doctrine 2 Order By ASC中建议的反转符号的技巧和最后的Null值不起作用,因为Doctrine不接受除属性名称和/ ASCDESC注释之外的任何内容.

小智 9

这是一篇旧帖子,但如果你使用的是doctrine查询构建器,我发现了一个非常简单的解决方案:

$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();
Run Code Online (Sandbox Code Playgroud)

PHP的方式,除了慢一点,避免使用偏移(例如无限滚动)

感谢/sf/answers/1639447771/


Fab*_*ler 4

可能不会。有一种 SQL 语法允许ORDER BY column DESC NULLS FIRST. 但是,并非所有数据库供应商都支持它,因此如果我正确扫描合并请求,则尚未将其合并到 DQL 中。根据您使用的数据库平台,您可能会很幸运。合并请求中的注释提供了有关如何在不同点扩展 Doctrine 来实现行为的见解,也许这可以帮助您自己完成此操作。