TYPO3:使用 TYPO3 Querybuilder 在 OrderBy 中使用 IS NULL 和 COALESCE
Posted
技术标签:
【中文标题】TYPO3:使用 TYPO3 Querybuilder 在 OrderBy 中使用 IS NULL 和 COALESCE【英文标题】:TYPO3: Using IS NULL and COALESCE in OrderBy with TYPO3 Querybuilder 【发布时间】:2021-02-12 17:26:56 【问题描述】:我想使用查询
SELECT `uid` FROM `machines` ORDER BY NOT ISNULL(`changed`),`changed` DESC
在我的控制器中。 为此,我使用这样的查询构建器:
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('forklifts');
$statement = $queryBuilder
->select('*')
->from('machines');
我尝试以这种方式添加 ORDERBY:
$statement->orderBy("NOT ISNULL(`changed`)");
$statement->addOrderBy("changed", "DESC");
但这不起作用。 是否可以在 TYPO3 Querybuilder 中执行此操作,或者是否有其他解决方案?
【问题讨论】:
【参考方案1】:您可以使用QueryBuilder::add()
绕过此限制:
$queryBuilder->add(
'orderBy',
$queryBuilder->expr()->isNotNull('changed'),
true
);
$queryBuilder->addOrderBy('changed', 'DESC');
这基本上是QueryBuilder::addOrderBy()
在内部所做的,但没有自动标识符引用。请注意,此处使用 ExpressionBuilder
而不是普通的 SQL sn-p 以确保 changed
字段名称仍被引用,即使作为约束的一部分。
【讨论】:
【参考方案2】:感谢 Mathias 将我推向正确的方向。
在 TYPO3 文档中https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/Database/ExpressionBuilder/Index.html
expr()->not()
未列为 TYPO3 查询构建器的方法。
但是
expr()->isNotNull()
存在。
所以这会起作用:
$queryBuilder->add(
'orderBy',
$queryBuilder->expr()->isNotNull('changed'),
true
);
$queryBuilder->addOrderBy('changed', 'DESC');
再次感谢您
【讨论】:
谢谢,我已经调整了我的答案,如果你愿意,可以删除你的答案。以上是关于TYPO3:使用 TYPO3 Querybuilder 在 OrderBy 中使用 IS NULL 和 COALESCE的主要内容,如果未能解决你的问题,请参考以下文章
如何在https TYPO3后端处理“非https”(http)站点