Дерево поведения
Делает таблицу, к которой оно прикреплено, похожей на вложенное множество и предоставляет методы для управления и извлечения информации из полученной иерархической структуры.
Таблицы, к которым прикреплено это поведение, должны содержать столбец, ссылающийся на родительскую строку, и два других числовых столбца (lft и rght), где неявный порядок будет кэширован.
Для получения дополнительной информации о том, что такое вложенное множество и как оно работает, обратитесь к https://www.sitepoint.com/hierarchical-data-database-2/
- Cake\ORM\Behavior реализует Cake\Event\EventListenerInterface использует Cake\Core\InstanceConfigTrait
-
Cake\ORM\Behavior\TreeBehavior
Краткое описание свойств
-
$_defaultConfigprotectedКонфигурация по умолчаниюarray -
$_primaryKeyprotectedКэшированная копия первого столбца первичного ключа таблицы.string
Унаследованные свойства
Краткое описание методов
- _ensureFields() protected
Убеждается, что предоставленная сущность содержит ненулевые значения для полей left и right
- _getMax() protectedВозвращает максимальное значение индекса в таблице.
- _getNode() protectedВозвращает один узел из дерева по его первичному ключу
- _getPrimaryKey() protectedВозвращает строковое значение, представляющее первичный ключ присоединённой таблицы
- _moveDown() protectedВспомогательная функция, используемая с фактическим кодом для moveDown
- _moveUp() protectedВспомогательная функция, используемая с фактическим кодом для moveUp
- _recoverTree() protectedРекурсивный метод, используемый для восстановления одного уровня дерева
- _removeFromTree() protectedВспомогательная функция, содержащая фактический код для removeFromTree
- _scope() protected
Изменяет переданный запрос таким образом, чтобы он возвращал только отфильтрованные записи, как определено в конфигурации дерева.
- _setAsRoot() protected
Обновляет поля left и right для переданной сущности, чтобы её можно было установить в качестве нового корня в дереве. Также изменяет порядок в остальной части дерева, чтобы структура оставалась корректной.
- _setChildrenLevel() protectedУстановить уровень для потомков.
- _setParent() protected
Устанавливает правильные значения left и right для переданной сущности, чтобы её можно было обновить с новым родителем. Также создаёт пробел в дереве, чтобы перемещение узла можно было выполнить без нарушения структуры.
- _sync() protected
Вспомогательная функция, используемая для автоматического изменения значений полей left и right на определённое количество, соответствующее переданным условиям.
- _unmarkInternalTree() protected
Вспомогательный метод, используемый для инвертирования знака полей left и right, которые меньше 0. Они были установлены в отрицательные значения ранее, чтобы их абсолютное значение не изменялось во время выполнения других преобразований дерева.
- afterSave() publicСлушатель после сохранения.
- beforeDelete() publicТакже удаляет узлы в поддереве сущности, подлежащей удалению
- beforeSave() public
Слушатель перед сохранением. Прозрачно управляет установкой полей lft и rght, если поле parent включено в параметры для сохранения.
- childCount() publicПолучить количество дочерних узлов.
- findChildren() publicПолучить дочерние узлы текущей модели
- findPath() public
Пользовательский метод поиска, который может использоваться для возвращения списка узлов от корня до конкретного узла в дереве. Для этого пользовательского поиска необходимо передать ключ 'for' в параметры, содержащие идентификатор узла для получения его пути.
- findTreeList() public
Получает представление элементов в дереве в виде плоского списка, где ключи — первичный ключ для таблицы, а значения — поле отображения для таблицы. Значения добавляются префиксы для визуального указания относительной глубины в дереве.
- formatTreeList() public
Форматирует запрос как плоский список, где ключи — первичный ключ для таблицы, а значения — поле отображения для таблицы. Значения добавляются префиксы для визуального указания относительной глубины в дереве.
- getLevel() publicВозвращает уровень глубины узла в дереве.
- initialize() publicМетод хука конструктора.
- moveDown() publicПереупорядочивает узел без изменения родителя.
- moveUp() publicПереупорядочивает узел без изменения родителя.
- recover() public
Восстанавливает значения столбцов lft и right из иерархии, определённой столбцом parent.
- removeFromTree() public
Удаляет текущий узел из дерева, позиционируя его как новый корень и перемещая всех детей на уровень выше.
Подробное описание методов
_ensureFields()исходный код protected
_ensureFields( Cake\Datasource\EntityInterface $entity )
Убеждается, что предоставленная сущность содержит ненулевые значения для полей left и right
Параметры
-
Cake\Datasource\EntityInterface$entity - Сущность, для которой необходимо убедиться в наличии полей
_getMax()исходный код protected
_getMax( )
Возвращает максимальное значение индекса в таблице.
Возвращает
целое число_getNode()исходный код protected
_getNode( mixed $id )
Возвращает один узел из дерева по его первичному ключу
Параметры
- смешанное
$id - Идентификатор записи.
Возвращает
Cake\Datasource\EntityInterfaceВыбрасывает
Cake\Datasource\Exception\RecordNotFoundExceptionПри отсутствии узла
_getPrimaryKey()исходный код protected
_getPrimaryKey( )
Возвращает строковое значение, представляющее первичный ключ присоединённой таблицы
Возвращает
строка_moveDown()source protected
_moveDown( Cake\Datasource\EntityInterface $node , integer|boolean $number )
Вспомогательная функция, используемая с фактическим кодом для перемещения вниз
Параметры
-
Cake\Datasource\EntityInterface$node - Узел для перемещения
- integer|boolean
$number - Количество позиций для перемещения узла или true для перемещения в последнюю позицию
Возвращает
Cake\Datasource\EntityInterface|boolean$node Узел после перемещения или false при ошибке
Выбрасывает
Cake\Datasource\Exception\RecordNotFoundExceptionКогда узел не был найден
_moveUp()source protected
_moveUp( Cake\Datasource\EntityInterface $node , integer|boolean $number )
Вспомогательная функция, используемая с фактическим кодом для перемещения вверх
Параметры
-
Cake\Datasource\EntityInterface$node - Узел для перемещения
- integer|boolean
$number - Количество позиций для перемещения узла или true для перемещения в первую позицию
Возвращает
Cake\Datasource\EntityInterface|boolean$node Узел после перемещения или false при ошибке
Выбрасывает
Cake\Datasource\Exception\RecordNotFoundExceptionКогда узел не был найден
_recoverTree()source protected
_recoverTree( integer $counter = 0 , mixed $parentId = null , integer $level = -1 )
Рекурсивный метод, используемый для восстановления одного уровня дерева
Параметры
- integer
$counterнеобязательно 0 - Значение последней левой колонки, которое было назначено
- mixed
$parentIdнеобязательно null - идентификатор родителя уровня, подлежащего восстановлению
- integer
$levelнеобязательно -1 - Уровень узла
Возвращает
integerСледующее значение для использования в левой колонке
_removeFromTree()source protected
_removeFromTree( Cake\Datasource\EntityInterface $node )
Вспомогательная функция, содержащая фактический код для removeFromTree
Параметры
-
Cake\Datasource\EntityInterface$node - Узел для удаления из дерева
Возвращает
Cake\Datasource\EntityInterface|falseузел после удаления из дерева или false при ошибке
_scope()source protected
_scope( Cake\ORM\Query $query )
Изменяет переданный запрос так, чтобы он возвращал только отфильтрованные записи, как определено в конфигурации дерева.
Параметры
-
Cake\ORM\Query$query - запрос для модификации
Возвращает
Cake\ORM\Query_setAsRoot()source protected
_setAsRoot( Cake\Datasource\EntityInterface $entity )
Обновляет левую и правую колонки для переданной сущности, чтобы ее можно было установить в качестве нового корня в дереве. Также изменяет порядок в остальной части дерева, чтобы структура оставалась валидной
Параметры
-
Cake\Datasource\EntityInterface$entity - Сущность, которая должна быть установлена в качестве нового корня
_setChildrenLevel()source protected
_setChildrenLevel( Cake\Datasource\EntityInterface $entity )
Устанавливает уровень для потомков.
Параметры
-
Cake\Datasource\EntityInterface$entity - Сущность, потомки которой нужно обновить.
_setParent()source protected
_setParent( Cake\Datasource\EntityInterface $entity , mixed $parent )
Устанавливает правильные значения левого и правого столбцов для переданной сущности, чтобы ее можно было обновить до нового родителя. Также создает пробел в дереве, чтобы перемещение узла можно было выполнить без нарушения структуры.
Параметры
-
Cake\Datasource\EntityInterface$entity - Сущность, родителя которой нужно изменить
- mixed
$parent - идентификатор родителя, который нужно установить
Выбрасывает
RuntimeExceptionЕсли родитель для установки сущности не является допустимым
_sync()source protected
_sync( integer $shift , string $dir , string $conditions , boolean $mark = false )
Вспомогательная функция, используемая для автоматической модификации значений левого и правого столбцов на определенную величину, соответствующую переданным условиям
Параметры
- integer
$shift - значение, используемое для обработки левого и правого столбцов
- string
$dir - Оператор для сдвига значения (+/-)
- string
$conditions SQL фрагмент, используемый для сравнения левого или правого столбца с ним.
- boolean
$markнеобязательно false указывает, нужно ли помечать обновленные значения, чтобы их нельзя было изменить последующими вызовами этой функции.
_unmarkInternalTree()source protected
_unmarkInternalTree( )
Вспомогательный метод, используемый для изменения знака левых и правых столбцов, которые меньше 0. Они были установлены в отрицательные значения ранее, чтобы их абсолютное значение не менялось при выполнении других преобразований дерева.
afterSave()source public
afterSave( Cake\Event\Event $event , Cake\Datasource\EntityInterface $entity )
Обработчик после сохранения.
Управляет обновлением уровня потомков текущей сохранённой сущности.
Параметры
-
Cake\Event\Event$event - Событие afterSave, которое было вызвано
-
Cake\Datasource\EntityInterface$entity - сущность, которая будет сохранена
beforeDelete()source public
beforeDelete( Cake\Event\Event $event , Cake\Datasource\EntityInterface $entity )
Также удаляет узлы в поддереве сущности, которая будет удалена
Параметры
-
Cake\Event\Event$event - Событие beforeDelete, которое было вызвано
-
Cake\Datasource\EntityInterface$entity - Сущность, которая будет сохранена
beforeSave()source public
beforeSave( Cake\Event\Event $event , Cake\Datasource\EntityInterface $entity )
Обработчик перед сохранением. Прозрачно управляет установкой полей lft и rght, если поле родителя включено в параметры, которые будут сохранены.
Параметры
-
Cake\Event\Event$event - Событие beforeSave, которое было вызвано
-
Cake\Datasource\EntityInterface$entity - сущность, которая будет сохранена
Выбрасывает
RuntimeExceptionЕсли родитель для установки узла недействителен
childCount()source public
childCount( Cake\Datasource\EntityInterface $node , boolean $direct = false )
Получить количество дочерних узлов.
Параметры
-
Cake\Datasource\EntityInterface$node - Сущность, для которой нужно подсчитать потомков
- boolean
$directнеобязательно false указывает, нужно ли подсчитывать все узлы в поддереве или только непосредственных потомков
Возвращает
integerКоличество дочерних узлов.
findChildren()source public
findChildren( Cake\ORM\Query $query , array $options )
Получить дочерние узлы текущей модели
Доступные параметры:
- for: Идентификатор записи для чтения.
- direct: Булево значение, возвращать только непосредственных (true) или все (false) потомки, по умолчанию false (все потомки).
Если параметр direct установлен в true, возвращаются только непосредственные потомки (на основе поля parent_id)
Параметры
-
Cake\ORM\Query$query - Запрос.
- array
$options - Массив параметров, как описано выше
Возвращает
Cake\ORM\QueryВыбрасывает
InvalidArgumentExceptionЕсли ключ 'for' не передан в $options
findPath()source public
findPath( Cake\ORM\Query $query , array $options )
Метод поиска, который можно использовать для возврата списка узлов от корня до конкретного узла в дереве. Для этого метода поиска необходимо передать ключ 'for' в опциях, содержащих идентификатор узла, для которого требуется получить путь.
Параметры
-
Cake\ORM\Query$query - Изменённый запрос
- массив
$options - список опций для запроса
Возвращает
Cake\ORM\QueryИсключения
InvalidArgumentExceptionЕсли ключ 'for' отсутствует в опциях
findTreeList()source public
findTreeList( Cake\ORM\Query $query , array $options )
Получает представление элементов в дереве в виде плоского списка, где ключами являются первичные ключи таблицы, а значениями — поле отображения таблицы. Значения префикс для визуального обозначения относительной глубины в дереве.
Опции
- keyPath: Путь, разделённый точкой, для извлечения поля, используемого в качестве ключа массива, или замыкание для возврата ключа из предоставленной строки.
- valuePath: Путь, разделённый точкой, для извлечения поля, используемого в качестве значения массива, или замыкание для возврата значения из предоставленной строки.
- spacer: Строка, используемая в качестве префикса для обозначения глубины в дереве для каждого элемента
Параметры
-
Cake\ORM\Query$query - Запрос.
- массив
$options - Массив опций, как описано выше.
Возвращает
Cake\ORM\QueryformatTreeList()source public
formatTreeList( Cake\ORM\Query $query , array $options = [] )
Форматирует запрос в виде плоского списка, где ключами являются первичные ключи таблицы, а значениями — поле отображения таблицы. Значения префикс для визуального обозначения относительной глубины в дереве.
Опции
- keyPath: Путь, разделённый точкой, до поля, которое будет ключом результирующего массива, или замыкание для возврата ключа из предоставленной строки.
- valuePath: Путь, разделённый точкой, до поля, которое является значением массива, или замыкание для возврата значения из предоставленной строки.
- spacer: Строка, используемая в качестве префикса для обозначения глубины в дереве для каждого элемента.
Параметры
-
Cake\ORM\Query$query - Объект запроса для форматирования.
- массив
$optionsнеобязательно [] - Массив опций, как описано выше.
Возвращает
Cake\ORM\QueryРасширенный запрос.
getLevel()source public
getLevel( integer|string|Cake\Datasource\EntityInterface $entity )
Возвращает уровень глубины узла в дереве.
Параметры
- целое число|строка|
Cake\Datasource\EntityInterface$entity - Сущность или первичный ключ, для которого требуется получить уровень.
Возвращает
целое число|логическое значениеЦелое число уровня или false, если узел не существует.
initialize()source public
initialize( array $config )
Метод обработки конструктора.
Параметры
- массив
$config - Настройки конфигурации, предоставленные этому поведению.
Переопределяет
Cake\ORM\Behavior::initialize() moveDown()source public
moveDown( Cake\Datasource\EntityInterface $node , integer|boolean $number = 1 )
Переупорядочивает узел, не изменяя родителя.
Если узел является последним дочерним элементом или является узлом верхнего уровня без последующего узла, этот метод вернёт false
Параметры
-
Cake\Datasource\EntityInterface$node - Узел, который нужно переместить
- целое число|логическое значение
$numberнеобязательно 1 - Количество позиций для перемещения узла или true для перемещения в последнюю позицию
Возвращает
Cake\Datasource\EntityInterface|логическое значениесущность после перемещения или false при ошибке
Исключения
Cake\Datasource\Exception\RecordNotFoundExceptionПри отсутствии узла
moveUp()source public
moveUp( Cake\Datasource\EntityInterface $node , integer|boolean $number = 1 )
Переупорядочивает узел, не изменяя родителя.
Если узел является первым дочерним элементом или является узлом верхнего уровня без предыдущего узла, этот метод вернёт false
Параметры
-
Cake\Datasource\EntityInterface$node - Узел, который нужно переместить
- целое число|логическое значение
$numberнеобязательно 1 - Количество позиций для перемещения узла или true для перемещения в первую позицию
Возвращает
Cake\Datasource\EntityInterface|логическое значение$node Узел после перемещения или false при ошибке
Исключения
Cake\Datasource\Exception\RecordNotFoundExceptionПри отсутствии узла
recover()source public
recover( )
Восстанавливает значения столбцов lft и right из иерархии, определённой столбцом parent.
removeFromTree()source public
removeFromTree( Cake\Datasource\EntityInterface $node )
Удаляет текущий узел из дерева, размещая его как новый корень и перемещая всех дочерних элементов на один уровень вверх.
Обратите внимание, что узел не будет удалён, а только перемещён из текущей позиции без перемещения его дочерних элементов.
Параметры
-
Cake\Datasource\EntityInterface$node - Узел для удаления из дерева
Возвращает
Cake\Datasource\EntityInterface|falseузел после удаления из дерева или false при ошибке
Методы, унаследованные от Cake\ORM\Behavior
__construct()source public
__construct( Cake\ORM\Table $table , array $config = [] )
Конструктор
Объединяет конфигурацию с параметрами по умолчанию и сохраняет в свойстве config
Параметры
-
Cake\ORM\Table$table - Таблица, к которой привязано это поведение.
- массив
$configнеобязательно [] - Конфигурация для данного поведения.
_reflectionCache()source protected
_reflectionCache( )
Получает методы, реализованные этим поведением
Использует метод implementedEvents() для исключения методов обратного вызова. Методы, начинающиеся с _ будут проигнорированы, так же как и методы, объявленные в Cake\ORM\Behavior
Возвращает
массивИсключения
ReflectionException_resolveMethodAliases()source protected
_resolveMethodAliases( string $key , array $defaults , array $config )
Удаляет алиасы методов, которые в противном случае будут дублироваться пользовательской конфигурацией.
Параметры
- строка
$key - Ключ для фильтрации.
- массив
$defaults - отображения методов по умолчанию.
- массив
$config - Настраиваемые отображения методов.
Возвращает
массивСписок данных конфигурации без дублирования.
getTable()source public
getTable( )
Получить экземпляр таблицы, к которому привязано это поведение.
Возвращает
Cake\ORM\TableЭкземпляр привязанной таблицы.
implementedEvents()source public
implementedEvents( )
Получает обратные вызовы модели, которые интересуют это поведение.
Определяя один из методов обратного вызова, предполагается, что поведение заинтересовано в соответствующем событии.
Переопределите этот метод, если вам нужно добавить обработчики событий нестандартного типа. Или если вы хотите, чтобы ваше поведение реагировало на нестандартные события.
Возвращает
массивРеализация
Cake\Event\EventListenerInterface::implementedEvents() implementedFinders()source public
implementedFinders( )
implementedFinders
Предоставляет отображение «псевдоним» -> «имя метода» реализованных методов поиска. Пример:
[ 'this' => 'findThis', 'alias' => 'findMethodName' ]
В приведенном примере вызов $Table->find('this') вызовет $Behavior->findThis(), а вызов $Table->find('alias') вызовет $Behavior->findMethodName()
Рекомендуется (хотя и необязательно) определять implementedFinders в свойстве config дочерних классов, чтобы не было необходимости использовать рефлексию для получения списка доступных методов. Примеры см. в базовых поведенческих моделях.
Возвращает
arrayВыбрасывает
ReflectionExceptionimplementedMethods()source public
implementedMethods( )
implementedMethods
Предоставляет отображение «псевдоним» -> «имя метода» реализованных методов. Пример:
[ 'method' => 'method', 'aliasedmethod' => 'somethingElse' ]
В приведенном примере вызов $Table->method() вызовет $Behavior->method(), а вызов $Table->aliasedmethod() вызовет $Behavior->somethingElse()
Рекомендуется (хотя и необязательно) определять implementedFinders в свойстве config дочерних классов, чтобы не было необходимости использовать рефлексию для получения списка доступных методов. Примеры см. в базовых поведенческих моделях.
Возвращает
arrayВыбрасывает
ReflectionExceptionverifyConfig()source public
verifyConfig( )
verifyConfig
Проверяет, что реализованные ключи содержат значения, указывающие на вызываемые элементы.
Выбрасывает
Cake\Core\Exception\Exceptionесли конфигурация неверна
Методы, используемые из Cake\Core\InstanceConfigTrait
_configDelete()source protected
_configDelete( string $key )
Удаляет один ключ конфигурации.
Параметры
- строка
$key - Ключ для удаления.
Выбрасывает
Cake\Core\Exception\Exceptionесли происходит попытка перезаписи существующей конфигурации
_configRead()source protected
_configRead( string|null $key )
Считывает ключ конфигурации.
Параметры
- строка|null
$key - Ключ для считывания.
Возвращает
mixed_configWrite()source protected
_configWrite( string|array $key , mixed $value , boolean|string $merge = false )
Записывает ключ конфигурации.
Параметры
- строка|массив
$key - Ключ для записи.
- mixed
$value - Значение для записи.
- boolean|строка
$mergeнеобязательно false Истина для рекурсивного слияния, «shallow» для простого слияния, ложь для перезаписи, по умолчанию ложь.
Выбрасывает
Cake\Core\Exception\Exceptionесли происходит попытка перезаписи существующей конфигурации
config()source public deprecated
config( string|array|null $key = null , mixed|null $value = null , boolean $merge = true )
Получение/Установка конфигурации.
Использование
Чтение всей конфигурации:
$this->config();
Чтение конкретного значения:
$this->config('key'); Чтение вложенного значения:
$this->config('some.nested.key'); Установка конкретного значения:
$this->config('key', $value); Установка вложенного значения:
$this->config('some.nested.key', $value); Обновление нескольких параметров конфигурации одновременно:
$this->config(['one' => 'value', 'another' => 'value']);
Устаревшее
3.4.0 используйте setConfig()/getConfig() вместо этого.Параметры
- строка|массив|null
$keyнеобязательно null - Ключ для получения/установки или полный массив конфигураций.
- mixed|null
$valueнеобязательно null - Значение для установки.
- boolean
$mergeнеобязательно true - Признак рекурсивного слияния или перезаписи существующей конфигурации, по умолчанию истина.
Возвращает
mixedЗначение считываемой конфигурации или сам объект при операциях записи.
Выбрасывает
Cake\Core\Exception\ExceptionПри попытке установить недопустимый ключ.
configShallow()source public
configShallow( string|array $key , mixed|null $value = null )
Сливает предоставленную конфигурацию с существующей конфигурацией. В отличие от config(), которая выполняет рекурсивное слияние для вложенных ключей, этот метод выполняет простое слияние.
Установка конкретного значения:
$this->configShallow('key', $value); Установка вложенного значения:
$this->configShallow('some.nested.key', $value); Обновление нескольких параметров конфигурации одновременно:
$this->configShallow(['one' => 'value', 'another' => 'value']);
Параметры
- строка|массив
$key - Ключ для установки или полный массив конфигураций.
- mixed|null
$valueнеобязательно null - Значение для установки.
Возвращает
$this
getConfig()source public
getConfig( string|null $key = null , mixed $default = null )
Возвращает конфигурацию.
Использование
Чтение всей конфигурации:
$this->getConfig();
Чтение конкретного значения:
$this->getConfig('key'); Чтение вложенного значения:
$this->getConfig('some.nested.key'); Чтение со значением по умолчанию:
$this->getConfig('some-key', 'default-value'); Параметры
- строка|null
$keyнеобязательно null - Ключ для получения или null для всей конфигурации.
- mixed
$defaultнеобязательно null - Возвращаемое значение, когда ключ не существует.
Возвращает
mixedЗначение считываемой конфигурации.
setConfig()source public
setConfig( string|array $key , mixed|null $value = null , boolean $merge = true )
Устанавливает конфигурацию.
Использование
Установка конкретного значения:
$this->setConfig('key', $value); Установка вложенного значения:
$this->setConfig('some.nested.key', $value); Обновление нескольких параметров конфигурации одновременно:
$this->setConfig(['one' => 'value', 'another' => 'value']);
Параметры
- строка|массив
$key - Ключ для установки или полный массив конфигураций.
- mixed|null
$valueнеобязательно null - Значение для установки.
- boolean
$mergeнеобязательно true - Признак рекурсивного слияния или перезаписи существующей конфигурации, по умолчанию истина.
Возвращает
$this
Выбрасывает
Cake\Core\Exception\ExceptionПри попытке установить недопустимый ключ.
Подробное описание свойств
$_defaultConfigsource
protected массив
Значения конфигурации по умолчанию
Они объединяются с пользовательской конфигурацией при использовании поведения.
[
'implementedFinders' => [
'path' => 'findPath',
'children' => 'findChildren',
'treeList' => 'findTreeList',
],
'implementedMethods' => [
'childCount' => 'childCount',
'moveUp' => 'moveUp',
'moveDown' => 'moveDown',
'recover' => 'recover',
'removeFromTree' => 'removeFromTree',
'getLevel' => 'getLevel',
'formatTreeList' => 'formatTreeList',
],
'parent' => 'parent_id',
'left' => 'lft',
'right' => 'rght',
'scope' => null,
'level' => null,
'recoverOrder' => null,
]
© 2005–present The Cake Software Foundation, Inc.
Licensed under the MIT License.
CakePHP is a registered trademark of Cake Software Foundation, Inc.
We are not endorsed by or affiliated with CakePHP.
https://api.cakephp.org/3.6/class-Cake.ORM.Behavior.TreeBehavior.html