默认情况下,MySQL 仍然会对一个NULL
值进行排序;如果已排序,它将仅将其放在结果集的开头,如果已排序ASC
,则将其放在末尾DESC
。在这里,您正在寻找 sort ASC
,但您希望NULL
值位于底部。
不幸的是,尽管 Doctrine 功能强大,但在这里不会提供太多支持,因为功能支持是有限的,而且大部分仅限于SELECT
, WHERE
, 和HAVING
子句。如果 QueryBuilder 符合以下任何一项,那么您实际上根本不会遇到问题:
select()
公认ISNULL()
orderBy()
或addOrderBy()
支持ISNULL()
- 该类支持
UNION
s 的概念(有了这个,您可以运行两个查询:一个是在哪里codeIata
,NULL
一个在哪里不是,你可以独立地对每个查询进行排序)
也就是说,您可以使用 ArtWorkAD 已经提到的用户定义函数,或者您可以使用两个不同的 Doctrine 查询复制最后一点:
$airlinesWithCode = $er->createQueryBuilder("airline")
->where("airline.iataCode IS NULL")
->getQuery()
->getResult();
$airlinesWithoutCode = $er->createQueryBuilder("airline")
->where("airline.iataCode IS NOT NULL")
->getQuery()
->getResult();
然后你可以将它们组合成一个数组,或者在你的模板中独立处理它们。
另一个想法是让 DQL 在一个数据集中返回所有内容,让 PHP 完成繁重的工作。就像是:
$airlines = $er->findAll();
$sortedAirlines = array();
// Add non-NULL values to the end if the sorted array
foreach ($airlines as $airline)
if ($airline->getCodeIata())
$sortedAirlines[] = $airline;
// Add NULL values to the end of the sorted array
foreach ($airlines as $airline)
if (!$airline->getCodeIata())
$sortedAirlines[] = $airline;
这两者的缺点是您将无法LIMIT
在 MySQL 中执行 s,因此它可能仅适用于相对较小的数据集。
无论如何,希望这能让你上路!