Дата последнего изменения: 07.11.2023
При необходимости одну таблицу можно описать несколькими сущностями, разделив записи на сегменты:
class Element4Table extends \Bitrix\Iblock\ElementTable { public static function getTableName() { return 'b_iblock_element'; } public static function setDefaultScope(Query $query) { $query->where("IBLOCK_ID", 4); } } class Element5Table extends \Bitrix\Iblock\ElementTable { public static function getTableName() { return 'b_iblock_element'; } public static function setDefaultScope(Query $query) { $query->where("IBLOCK_ID", 5); } }
Метод setDefaultScope будет выполняться при каждом запросе, пропуская через себя объект запроса. В нем можно задавать не только фильтр, но и любые другие параметры запроса.
Начиная с версии 20.5.500 появилась возможность задать предустановленные выборки – методы with*. Это аналог setDefaultScope, но не на глобальном уровне, а на пользовательском – вызов при необходимости. После описания метода в сущности можно вызывать его в конструкторе запросов:
class UserTable { public static function withActive(Query $query) { $query->where('ACTIVE', true); } } $activeUsers = UserTable::query() ->withActive() ->fetchCollection(); // WHERE `ACTIVE`='Y'
В качестве аргумента используется объект Bitrix\Main\ORM\Query\Query, поэтому можно задавать не только фильтр, но и любые другие параметры запроса. Кроме того, можно дополнить метод своими аргументами, которые также будут переданы при вызове из конструктора запросов:
class UserTable { public static function withActive(Query $query, $value) { $query ->addSelect('LOGIN') ->where('ACTIVE', $value); } } $activeUsers = UserTable::query() ->withActive(false) ->fetchCollection(); // SELECT `LOGIN` ... WHERE `ACTIVE`='N'