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的主要内容,如果未能解决你的问题,请参考以下文章

TYPO3:清除索引搜索缓存

如何在https TYPO3后端处理“非https”(http)站点

TYPO3 图像处理也适用于 PDF 文件?

TYPO3 调度程序任务 - 奇怪的行为

TYPO3 DatabaseQueryProcessor:相同 UID 的多个输出

TYPO3 CMS 中的 dotenv-connector