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');
Еще раз спасибо