Документация

QueryTree: область дерева

DevBx\Core\Internals\QueryTree наследует Bitrix\Main\ORM\Query\Query и добавляет один метод:

php
public function getScopeWhere($forceObjectPrimary = false)

Он строит запрос и отдаёт из него только условие WHERE — строкой, без SELECT и FROM.

Зачем это нужно

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

Если в одной таблице лежит несколько независимых деревьев — у местоположений Битрикса это тип узла, у своего класса это может быть что угодно, — такой запрос обязан ограничиться своим деревом. Иначе перенос узла раздвинет границы у чужого.

Связка выглядит так:

  • Tree::getQueryClass() подставляет QueryTree вместо обычного класса запроса;
  • Tree::getScopeWhere() собирает через него условие и даёт таблице псевдоним devbx_tree;
  • прямые запросы переноса и удаления дописывают это условие к своему WHERE.

Что отдаёт базовая реализация

Пустую строку. Запрос строится без фильтра, значит и условия нет — ограничения области у Tree по умолчанию не существует, и это верно для таблицы с одним деревом.

Область задаётся переопределением в своём классе:

php
class CategoryTable extends Tree
{
    public static function getScopeWhere()
    {
        return "devbx_tree.SITE_ID = '" . static::currentSiteId() . "'";
    }
}

Псевдоним devbx_tree обязателен: под этим именем таблица участвует в прямых запросах Tree. Условие, написанное на другое имя, приведёт к ошибке запроса.