0

我想使用查询

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 中执行此操作,或者是否有其他解决方案?

4

2 回答 2

3

您可以使用QueryBuilder::add()绕过此限制:

$queryBuilder->add(
    'orderBy',
    $queryBuilder->expr()->isNotNull('changed'),
    true
);
$queryBuilder->addOrderBy('changed', 'DESC');

这基本上是QueryBuilder::addOrderBy()在内部做的,但没有自动标识符引用。请注意,ExpressionBuilder这里使用的是 代替普通 SQL 片段,以确保changed字段名称仍然被引用,即使作为约束的一部分。

于 2020-10-30T08:57:38.723 回答
0

感谢 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');

再次感谢你

于 2020-10-30T09:26:08.830 回答