Spec-Zone.ru › CakePHP 3.6

Дерево поведения

Делает таблицу, к которой оно прикреплено, похожей на вложенное множество и предоставляет методы для управления и извлечения информации из полученной иерархической структуры.

Таблицы, к которым прикреплено это поведение, должны содержать столбец, ссылающийся на родительскую строку, и два других числовых столбца (lft и rght), где неявный порядок будет кэширован.

Для получения дополнительной информации о том, что такое вложенное множество и как оно работает, обратитесь к https://www.sitepoint.com/hierarchical-data-database-2/

Cake\ORM\Behavior реализует Cake\Event\EventListenerInterface использует Cake\Core\InstanceConfigTrait
Extended by Cake\ORM\Behavior\TreeBehavior
Пространство имен: Cake\ORM\Behavior
Расположение: ORM/Behavior/TreeBehavior.php

Краткое описание свойств

  • $_defaultConfig protected
    array
    Конфигурация по умолчанию
  • $_primaryKey protected
    string
    Кэшированная копия первого столбца первичного ключа таблицы.

Унаследованные свойства

  • _reflectionCache, _table _config, _configInitialized

Краткое описание методов

  • _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( )

Возвращает строковое значение, представляющее первичный ключ присоединённой таблицы

Возвращает

строка
END_OF_DOCUMENT_MARKER

_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\Query

formatTreeList()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

Выбрасывает

ReflectionException

implementedMethods()source public

implementedMethods( )

implementedMethods

Предоставляет отображение «псевдоним» -> «имя метода» реализованных методов. Пример:

[
   'method' => 'method',
   'aliasedmethod' => 'somethingElse'
 ]

В приведенном примере вызов $Table->method() вызовет $Behavior->method(), а вызов $Table->aliasedmethod() вызовет $Behavior->somethingElse()

Рекомендуется (хотя и необязательно) определять implementedFinders в свойстве config дочерних классов, чтобы не было необходимости использовать рефлексию для получения списка доступных методов. Примеры см. в базовых поведенческих моделях.

Возвращает

array

Выбрасывает

ReflectionException

verifyConfig()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,
]

$_primaryKeysource

protected строка

Кэшированная копия первого столбца первичного ключа таблицы.

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API