QueryTree: область дерева
DevBx\Core\Internals\QueryTree наследует Bitrix\Main\ORM\Query\Query и добавляет один метод:
public function getScopeWhere($forceObjectPrimary = false)
Он строит запрос и отдаёт из него только условие WHERE — строкой, без SELECT и FROM.
Зачем это нужно
Tree местами обходит слой сущностей и правит границы прямым запросом: так делаются перенос и
удаление поддерева. Прямой запрос ничего не знает про отбор, который сущность применяет сама.
Если в одной таблице лежит несколько независимых деревьев — у местоположений Битрикса это тип узла, у своего класса это может быть что угодно, — такой запрос обязан ограничиться своим деревом. Иначе перенос узла раздвинет границы у чужого.
Связка выглядит так:
Tree::getQueryClass()подставляетQueryTreeвместо обычного класса запроса;Tree::getScopeWhere()собирает через него условие и даёт таблице псевдонимdevbx_tree;- прямые запросы переноса и удаления дописывают это условие к своему
WHERE.
Что отдаёт базовая реализация
Пустую строку. Запрос строится без фильтра, значит и условия нет — ограничения области у Tree
по умолчанию не существует, и это верно для таблицы с одним деревом.
Область задаётся переопределением в своём классе:
class CategoryTable extends Tree
{
public static function getScopeWhere()
{
return "devbx_tree.SITE_ID = '" . static::currentSiteId() . "'";
}
}
Псевдоним devbx_tree обязателен: под этим именем таблица участвует в прямых запросах Tree.
Условие, написанное на другое имя, приведёт к ошибке запроса.