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

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

Просмотров: 23703
Дата последнего изменения: 07.11.2023
Анна Кокина
Сложность урока:
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'



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

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