TYPO3: использование IS NULL и COALESCE в OrderBy с TYPO3 Querybuilder

Я хочу использовать запрос

SELECT `uid` FROM `machines` ORDER BY NOT ISNULL(`changed`),`changed` DESC

в моем контроллере. Для этого я использую конструктор запросов следующим образом:

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('forklifts');
$statement = $queryBuilder
    ->select('*')
    ->from('machines');

Я попытался добавить ЗАКАЗ таким образом:

$statement->orderBy("NOT ISNULL(`changed`)");
$statement->addOrderBy("changed", "DESC");

Но это не работает. Можно ли это сделать в TYPO3 Querybuilder или есть другое решение этой проблемы?

2 ответа

Вы можете использовать QueryBuilder::add() чтобы обойти это ограничение:

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

Это в основном то, что QueryBuilder::addOrderBy()работает внутренне, но без автоматического цитирования идентификатора. Обратите внимание, что ExpressionBuilder используется здесь вместо простого фрагмента SQL, чтобы гарантировать changed имя поля по-прежнему цитируется, даже как часть ограничения.

Спасибо, Матиас, за то, что подтолкнул меня в правильном направлении.

В документации 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');

Еще раз спасибо

Другие вопросы по тегам