В предыдущих версиях Bitrix, с использованием старого ядра, разработчики могли легко применять сортировку "ASC, затем NULLS" с помощью функции `CIBlockElement::GetList`.
CIBlockElement::GetList(["CODE"=>"asc,nulls"], $arFilter, false, [], $arSelect);
Однако, переход на новое ядро D7 Bitrix вызвал ряд вопросов у разработчиков. Многие из них задаются вопросом: "Как же использовать этот функционал в новом ядре?"
В D7 Bitrix, для достижения аналогичного результата, вам нужно использовать ORM (Object-Relational Mapping). Это может показаться немного сложнее, но на самом деле это просто вопрос создания нового запроса и установки нужного порядка сортировки.
Вот пример того, как это можно сделать:
$query = new Bitrix\Main\ORM\Query\Query(ElementTable::class);
$query->addSelect('CODE');
$query->registerRuntimeField(
new \Bitrix\Main\ORM\Fields\ExpressionField(
'CODENULL',
'length(%s)>0',
['CODE']
)
);
$query->setOrder([
'CODENULL' => 'desc',
'CODE' => 'asc',
]);
$rows = $query->fetchAll();
# Создание запроса
Вначале создаем новый объект запроса, указывая класс таблицы, с которой мы хотим работать. В данном случае, это `ElementTable::class`.
$query = new Bitrix\Main\ORM\Query\Query(ElementTable::class);
# Выбор полей
Затем мы выбираем, какие поля мы хотим получить в результате запроса. В данном случае, мы выбираем поле `CODE` (Символьный код).
$query->addSelect('CODE');
# Регистрация временного поля
Далее, мы регистрируем временное поле `CODENULL`, которое будет содержать результат проверки на пустоту поля `CODE`.
$query->registerRuntimeField(
new \Bitrix\Main\ORM\Fields\ExpressionField(
'CODENULL',
'length(%s)>0',
['CODE']
)
);
# Установка порядка сортировки
После этого, мы устанавливаем порядок сортировки. Мы можем сортировать данные по полю `CODE` и по полю `CODENULL`, которое мы только что зарегистрировали. Данный пример аналогичен старой сортировки `asc,nulls`
$query->setOrder([
'CODENULL' => 'desc',
'CODE' => 'asc',
]);
Этот код сортирует данные по полю `CODE` в порядке возрастания, но сначала сортирует по полю `CODENULL` в порядке убывания, что означает, что сначала будут отображены записи, у которых поле `CODE` не пустое.
# Получение данных
Наконец, мы получаем все строки, соответствующие нашему запросу, в виду массива.
$rows = $query->fetchAll();
Таким образом, вы можете использовать сортировку "ASC, затем NULLS" в D7 1С-Битрикс. Это может потребовать немного больше кода, но это обеспечивает большую гибкость и контроль над вашими запросами.
# Все вариации сортировок
# asc,nulls
$query->setOrder([
'CODENULL' => 'desc',
'CODE' => 'asc',
]);
# desc,nulls
$query->setOrder([
'CODENULL' => 'desc',
'CODE' => 'desc',
]);
# nulls,asc
$query->setOrder([
'CODENULL' => 'asc',
'CODE' => 'asc',
]);
# nulls,desc
$query->setOrder([
'CODENULL' => 'asc',
'CODE' => 'desc',
]);