175  /  382
Справочник

Предустановленные выборки

Просмотров: 10898
Дата последнего изменения: 20.06.2022
Анна Кокина
Сложность урока:
4 уровень - сложно, требуется сосредоточиться, внимание деталям и точному следованию инструкции.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

  Глобальная область данных

При необходимости одну таблицу можно описать несколькими сущностями, разделив записи на сегменты:

    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'



Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии