类 TreeBehavior
使附加此行为的表表现得像一个嵌套集,并提供用于管理和检索派生层次结构信息的方法。
附加此行为的表需要有一个引用父行的列,以及两个其他数值列(lft 和 rght),其中隐式顺序将被缓存。
有关嵌套集及其工作原理的更多信息,请参阅 https://www.sitepoint.com/hierarchical-data-database-2/
属性摘要
-
$_config protected
array<string, mixed>
运行时配置
-
$_configInitialized protected
bool
配置属性是否已使用默认值进行配置
-
$_defaultConfig protected
array<string, mixed>
默认配置
-
$_primaryKey protected
string
表主键中第一列的缓存副本。
-
$_reflectionCache protected static
array<string, array>
行为的反射方法缓存。
-
$_table protected
Cake\ORM\Table
表实例。
方法摘要
-
__construct() public
构造函数
-
_configDelete() protected
删除单个配置键。
-
_configRead() protected
读取配置键。
-
_configWrite() protected
写入配置键。
-
_ensureFields() protected
确保提供的实体包含左列和右列的非空值
-
_getMax() protected
返回表中最大索引值。
-
_getNode() protected
从树中返回单个节点及其主键
-
_getPrimaryKey() protected
返回一个表示附加表的primaryKey的单个字符串值
-
_moveDown() protected
用于 moveDown 的实际代码的辅助函数
-
_moveUp() protected
用于 moveUp 的实际代码的辅助函数
-
_recoverTree() protected
用于恢复树的单个级别的递归方法
-
_reflectionCache() protected
获取此行为实现的方法
-
_removeFromTree() protected
包含 removeFromTree 的实际代码的辅助函数
-
_resolveMethodAliases() protected
删除别名方法,这些方法否则将被用户配置重复。
-
_scope() protected
更改传递的查询,使其仅返回树配置中定义的范围记录。
-
_setAsRoot() protected
更新传递的实体的左列和右列,以便可以将其设置为树中的新根。它还会修改树中其余部分的排序,以便结构保持有效
-
_setChildrenLevel() protected
设置后代的级别。
-
_setParent() protected
设置传递的实体的正确左列和右列值,以便可以将其更新到新父级。它还会在树中创建空洞,以便在不破坏结构的情况下完成节点移动。
-
_sync() protected
辅助函数,用于根据传递的条件自动更改左列和右列的值,这两个值的更改量相同。
-
_unmarkInternalTree() protected
辅助方法,用于反转小于 0 的左列和右列的符号。它们在之前被设置为负值,因此在执行其他树转换时它们的绝对值不会改变。
-
afterSave() public
保存后监听器。
-
beforeDelete() public
还会删除要删除的实体子树中的节点
-
beforeSave() public
保存前监听器。如果要保存的参数中包含父列,则会透明地管理 lft 和 rght 字段的设置。
-
childCount() public
获取子节点的数量。
-
configShallow() public
将提供的配置与现有配置合并。与
config()
不同,config()
对嵌套键执行递归合并,此方法执行简单合并。 -
findChildren() public
获取当前模型的子节点。
-
findPath() public
自定义查找器方法,可用于返回从树的根到特定节点的节点列表。此自定义查找器要求选项中传递键 'for',其中包含要获取其路径的节点的 id。
-
findTreeList() public
获取树中元素的表示形式,作为一个扁平列表,其中键是表的主键,值是表的显示字段。值带有前缀,以便在视觉上指示树中的相对深度。
-
formatTreeList() public
将查询格式化为扁平列表,其中键是表的主键,值是表的显示字段。值带有前缀,以便在视觉上指示树中的相对深度。
-
getConfig() public
返回配置。
-
getConfigOrFail() public
返回此特定键的配置。
-
getLevel() public
返回树中节点的深度级别。
-
implementedEvents() public
获取此行为感兴趣的模型回调。
-
implementedFinders() public
implementedFinders
-
implementedMethods() public
implementedMethods
-
initialize() public
构造函数钩子方法。
-
moveDown() public
重新排序节点,而不改变父级。
-
moveUp() public
重新排序节点,而不改变其父级。
-
recover() public
从父列定义的层次结构中恢复 lft 和 right 列的值。
-
removeFromTree() public
通过将当前节点定位为新的根并将所有子节点向上重新父级一层来从树中删除当前节点。
-
setConfig() public
设置配置。
-
table() public
获取此行为绑定的表实例。
-
verifyConfig() public
verifyConfig
方法详细信息
__construct() ¶ public
__construct(Cake\ORM\Table $table, array<string, mixed> $config = [])
构造函数
将配置与默认值合并并存储在配置属性中
参数
-
Cake\ORM\Table
$table 此行为附加的表。
-
array<string, mixed>
$config optional 此行为的配置。
_configDelete() ¶ protected
_configDelete(string $key): void
删除单个配置键。
参数
-
string
$key 要删除的键。
返回值
void
抛出
Cake\Core\Exception\CakeException
如果尝试覆盖现有配置
_configRead() ¶ protected
_configRead(string|null $key): mixed
读取配置键。
参数
-
string|null
$key 要读取的键。
返回值
混合
_configWrite() ¶ protected
_configWrite(array<string, mixed>|string $key, mixed $value, string|bool $merge = false): void
写入配置键。
参数
-
array<string, mixed>|string
$key 要写入的键。
-
混合
$value 要写入的值。
-
字符串|布尔值
$merge 可选 如果为 true 则递归合并,'shallow' 表示简单合并,false 表示覆盖,默认为 false。
返回值
void
抛出
Cake\Core\Exception\CakeException
如果尝试覆盖现有配置
_ensureFields() ¶ 受保护
_ensureFields(Cake\Datasource\EntityInterface $entity): void
确保提供的实体包含左列和右列的非空值
参数
-
Cake\Datasource\EntityInterface
$entity 要确保字段的实体
返回值
void
_getNode() ¶ 受保护
_getNode(mixed $id): Cake\Datasource\EntityInterface
从树中返回单个节点及其主键
参数
-
混合
$id 记录 ID。
返回值
Cake\Datasource\EntityInterface
抛出
Cake\Datasource\Exception\RecordNotFoundException
当节点未找到时
_moveDown() ¶ 受保护
_moveDown(Cake\Datasource\EntityInterface $node, int|true $number): Cake\Datasource\EntityInterface
用于 moveDown 的实际代码的辅助函数
参数
-
Cake\Datasource\EntityInterface
$node 要移动的节点
-
int|true
$number 要移动节点的位置数,或 true 表示移动到最后一个位置
返回值
Cake\Datasource\EntityInterface
抛出
Cake\Datasource\Exception\RecordNotFoundException
当节点未找到时
_moveUp() ¶ 受保护
_moveUp(Cake\Datasource\EntityInterface $node, int|true $number): Cake\Datasource\EntityInterface
用于 moveUp 的实际代码的辅助函数
参数
-
Cake\Datasource\EntityInterface
$node 要移动的节点
-
int|true
$number 要移动节点的位置数,或 true 表示移动到第一个位置
返回值
Cake\Datasource\EntityInterface
抛出
Cake\Datasource\Exception\RecordNotFoundException
当节点未找到时
_recoverTree() ¶ 受保护
_recoverTree(int $lftRght = 1, mixed $parentId = null, int $level = 0): int
用于恢复树的单个级别的递归方法
参数
-
int
$lftRght 可选 开始的 lft/rght 值
-
混合
$parentId 可选 要恢复的级别的父 ID
-
int
$level 可选 节点级别
返回值
int
_reflectionCache() ¶ 受保护
_reflectionCache(): array
获取此行为实现的方法
使用 implementedEvents() 方法排除回调方法。以 _
开头的将被忽略,Cake\ORM\Behavior 上声明的方法也是如此
返回值
数组
抛出
ReflectionException
_removeFromTree() ¶ 受保护
_removeFromTree(Cake\Datasource\EntityInterface $node): Cake\Datasource\EntityInterface|false
包含 removeFromTree 的实际代码的辅助函数
参数
-
Cake\Datasource\EntityInterface
$node 要从树中移除的节点
返回值
Cake\Datasource\EntityInterface|false
_resolveMethodAliases() ¶ 受保护
_resolveMethodAliases(string $key, array<string, mixed> $defaults, array<string, mixed> $config): array
删除别名方法,这些方法否则将被用户配置重复。
参数
-
string
$key 要过滤的键。
-
array<string, mixed>
$defaults 默认方法映射。
-
array<string, mixed>
$config 自定义方法映射。
返回值
数组
_scope() ¶ 受保护
_scope(Cake\ORM\Query\SelectQueryCake\ORM\Query\UpdateQueryCake\ORM\Query\DeleteQuery $query): Cake\ORM\Query\SelectQueryCake\ORM\Query\UpdateQueryCake\ORM\Query\DeleteQuery
更改传递的查询,使其仅返回树配置中定义的范围记录。
参数
-
Cake\ORM\Query\SelectQueryCake\ORM\Query\UpdateQueryCake\ORM\Query\DeleteQuery
$query 要修改的查询
返回值
Cake\ORM\Query\SelectQueryCake\ORM\Query\UpdateQueryCake\ORM\Query\DeleteQuery
_setAsRoot() ¶ 受保护
_setAsRoot(Cake\Datasource\EntityInterface $entity): void
更新传递的实体的左列和右列,以便可以将其设置为树中的新根。它还会修改树中其余部分的排序,以便结构保持有效
参数
-
Cake\Datasource\EntityInterface
$entity 要设置为新根的实体
返回值
void
_setChildrenLevel() ¶ 受保护
_setChildrenLevel(Cake\Datasource\EntityInterface $entity): void
设置后代的级别。
参数
-
Cake\Datasource\EntityInterface
$entity 其子孙需要更新的实体。
返回值
void
_setParent() ¶ 受保护
_setParent(Cake\Datasource\EntityInterface $entity, mixed $parent): void
设置传递的实体的正确左列和右列值,以便可以将其更新到新父级。它还会在树中创建空洞,以便在不破坏结构的情况下完成节点移动。
参数
-
Cake\Datasource\EntityInterface
$entity 要重新设置父级的实体
-
混合
$parent 要设置的父级 ID
返回值
void
抛出
Cake\Database\Exception\DatabaseException
如果要设置到实体的父级无效
_sync() ¶ 受保护
_sync(int $shift, string $dir, string $conditions, bool $mark = false): void
辅助函数,用于根据传递的条件自动更改左列和右列的值,这两个值的更改量相同。
参数
-
int
$shift 用于操作左列和右列的值
-
字符串
$dir 用于移位值的运算符 (+/-)
-
字符串
$conditions 用于将左或右与之进行比较的 SQL 代码片段。
-
布尔值
$mark 可选 是否标记更新的值,以便将来调用此函数不会修改它们。
返回值
void
_unmarkInternalTree() ¶ 受保护
_unmarkInternalTree(): void
辅助方法,用于反转小于 0 的左列和右列的符号。它们在之前被设置为负值,因此在执行其他树转换时它们的绝对值不会改变。
返回值
void
afterSave() ¶ 公共
afterSave(Cake\Event\EventInterfaceCake\ORM\Table> $event, Cake\Datasource\EntityInterface $entity): void
保存后监听器。
管理当前保存的实体的后代级别的更新。
参数
-
Cake\Event\EventInterfaceCake\ORM\Table>
$event 触发的 afterSave 事件
-
Cake\Datasource\EntityInterface
$entity 要保存的实体
返回值
void
beforeDelete() ¶ 公共
beforeDelete(Cake\Event\EventInterfaceCake\ORM\Table> $event, Cake\Datasource\EntityInterface $entity): void
还会删除要删除的实体子树中的节点
参数
-
Cake\Event\EventInterfaceCake\ORM\Table>
$event 触发的 beforeDelete 事件
-
Cake\Datasource\EntityInterface
$entity 要保存的实体
返回值
void
beforeSave() ¶ 公共
beforeSave(Cake\Event\EventInterfaceCake\ORM\Table> $event, Cake\Datasource\EntityInterface $entity): void
保存前监听器。如果要保存的参数中包含父列,则会透明地管理 lft 和 rght 字段的设置。
参数
-
Cake\Event\EventInterfaceCake\ORM\Table>
$event 触发的 beforeSave 事件
-
Cake\Datasource\EntityInterface
$entity 要保存的实体
返回值
void
抛出
Cake\Database\Exception\DatabaseException
如果要为节点设置的父级无效
childCount() ¶ 公共
childCount(Cake\Datasource\EntityInterface $node, bool $direct = false): int
获取子节点的数量。
参数
-
Cake\Datasource\EntityInterface
$node 要为其计数子级的实体
-
布尔值
$direct 可选 是否要计数子树中的所有节点,还是只计数直接子级
返回值
int
configShallow() ¶ 公共
configShallow(array<string, mixed>|string $key, mixed|null $value = null): $this
将提供的配置与现有配置合并。与 config()
不同,config()
对嵌套键执行递归合并,此方法执行简单合并。
设置特定值
$this->configShallow('key', $value);
设置嵌套值
$this->configShallow('some.nested.key', $value);
同时更新多个配置设置
$this->configShallow(['one' => 'value', 'another' => 'value']);
参数
-
array<string, mixed>|string
$key 要设置的键,或完整的配置数组。
-
混合|null
$value 可选 要设置的值。
返回值
$this
findChildren() ¶ 公共
findChildren(Cake\ORM\Query\SelectQuery $query, string|int $for, bool $direct = false): Cake\ORM\Query\SelectQuery
获取当前模型的子节点。
如果 direct 选项设置为 true,则只返回直接子级(基于 parent_id 字段)。
参数
-
Cake\ORM\Query\SelectQuery
$query 查询。
-
字符串|int
$for 要读取的记录的 ID。也可以是选项数组。
-
布尔值
$direct 可选 是否只返回直接子级(true)或所有子级(false)。
返回值
Cake\ORM\Query\SelectQuery
抛出
InvalidArgumentException
当 $options 中没有传递 'for' 键时
findPath() ¶ 公共
findPath(Cake\ORM\Query\SelectQuery $query, string|int $for): Cake\ORM\Query\SelectQuery
自定义查找器方法,可用于返回从树的根到特定节点的节点列表。此自定义查找器要求选项中传递键 'for',其中包含要获取其路径的节点的 id。
参数
-
Cake\ORM\Query\SelectQuery
$query 要修改的构造的查询
-
字符串|int
$for 要查找的路径,或包含
for
的选项数组。
返回值
Cake\ORM\Query\SelectQuery
抛出
InvalidArgumentException
如果 options 中缺少 'for' 键
findTreeList() ¶ 公共
findTreeList(Cake\ORM\Query\SelectQuery $query, Closure|string|null $keyPath = null, Closure|string|null $valuePath = null, string|null $spacer = null): Cake\ORM\Query\SelectQuery
获取树中元素的表示形式,作为一个扁平列表,其中键是表的主键,值是表的显示字段。值带有前缀,以便在视觉上指示树中的相对深度。
参数
-
Cake\ORM\Query\SelectQuery
$query 查询。
-
闭包|字符串|null
$keyPath 可选 用于获取用于数组键的字段的点分隔路径,或用于从提供的行中返回键的闭包。
-
闭包|字符串|null
$valuePath 可选 用于获取用于数组值的字段的点分隔路径,或用于从提供的行中返回值的闭包。
-
字符串|null
$spacer 可选 用于作为前缀来表示每个项目的树中深度的字符串。
返回值
Cake\ORM\Query\SelectQuery
formatTreeList() ¶ 公共
formatTreeList(Cake\ORM\Query\SelectQuery $query, Closure|string|null $keyPath = null, Closure|string|null $valuePath = null, string|null $spacer = null): Cake\ORM\Query\SelectQuery
将查询格式化为扁平列表,其中键是表的主键,值是表的显示字段。值带有前缀,以便在视觉上指示树中的相对深度。
参数
-
Cake\ORM\Query\SelectQuery
$query 要格式化的查询对象。
-
闭包|字符串|null
$keyPath 可选 指向结果数组键的字段的点分隔路径,或一个闭包,从提供的行返回键。
-
闭包|字符串|null
$valuePath 可选 指向数组值的字段的点分隔路径,或一个闭包,从提供的行返回值。
-
字符串|null
$spacer 可选 用于作为前缀来表示每个项目的树中深度的字符串。
返回值
Cake\ORM\Query\SelectQuery
getConfig() ¶ public
getConfig(string|null $key = null, mixed $default = null): mixed
返回配置。
用法
读取整个配置
$this->getConfig();
读取特定值
$this->getConfig('key');
读取嵌套值
$this->getConfig('some.nested.key');
使用默认值读取
$this->getConfig('some-key', 'default-value');
参数
-
string|null
$key optional 要获取的键,或整个配置的 null。
-
mixed
$default optional 当键不存在时的返回值。
返回值
混合
getConfigOrFail() ¶ public
getConfigOrFail(string $key): mixed
返回此特定键的配置。
此键的配置值必须存在,它永远不能为 null。
参数
-
string
$key 要获取的键。
返回值
混合
抛出
InvalidArgumentException
getLevel() ¶ public
getLevel(Cake\Datasource\EntityInterface|string|int $entity): int|false
返回树中节点的深度级别。
参数
-
Cake\Datasource\EntityInterface|string|int
$entity 获取其级别的实体或主键。
返回值
int|false
implementedEvents() ¶ public
implementedEvents(): array<string, mixed>
获取此行为感兴趣的模型回调。
通过定义一个回调方法,行为被认为对相关事件感兴趣。
如果你需要添加非传统的事件监听器,或者你希望你的行为监听非标准事件,请重写此方法。
返回值
array<string, mixed>
implementedFinders() ¶ public
implementedFinders(): array
implementedFinders
提供一个行为实现的查找器的别名->方法名映射。示例
[
'this' => 'findThis',
'alias' => 'findMethodName'
]
使用上面的示例,对 $table->find('this')
的调用将调用 $behavior->findThis()
,对 $table->find('alias')
的调用将调用 $behavior->findMethodName()
建议,但不要求,在子类的 config 属性中定义 implementedFinders,这样就不需要使用反射来推断可用方法列表。查看核心行为以获取示例
返回值
数组
抛出
ReflectionException
implementedMethods() ¶ public
implementedMethods(): array
implementedMethods
提供行为实现的方法的别名->方法名映射。示例
[
'method' => 'method',
'aliasedMethod' => 'somethingElse'
]
使用上面的示例,对 $table->method()
的调用将调用 $behavior->method()
,对 $table->aliasedMethod()
的调用将调用 $behavior->somethingElse()
建议,但不要求,在子类的 config 属性中定义 implementedFinders,这样就不需要使用反射来推断可用方法列表。查看核心行为以获取示例
返回值
数组
抛出
ReflectionException
initialize() ¶ public
initialize(array<string, mixed> $config): void
构造函数钩子方法。
实现此方法以避免覆盖构造函数并调用父类。
参数
-
array<string, mixed>
$config
返回值
void
moveDown() ¶ public
moveDown(Cake\Datasource\EntityInterface $node, int|true $number = 1): Cake\Datasource\EntityInterface|false
重新排序节点,而不改变父级。
如果节点是最后一个子节点,或者是一个没有后续节点的顶级节点,此方法将返回相同的节点而不做任何更改。
参数
-
Cake\Datasource\EntityInterface
$node 要移动的节点
-
int|true
$number optional 移动节点的位数,或者 true 将移动到最后一个位置。
返回值
Cake\Datasource\EntityInterface|false
抛出
Cake\Datasource\Exception\RecordNotFoundException
当节点未找到时
moveUp() ¶ public
moveUp(Cake\Datasource\EntityInterface $node, int|true $number = 1): Cake\Datasource\EntityInterface|false
重新排序节点,而不改变其父级。
如果节点是第一个子节点,或者是一个没有前一个节点的顶级节点,此方法将返回相同的节点而不做任何更改。
参数
-
Cake\Datasource\EntityInterface
$node 要移动的节点
-
int|true
$number optional 要移动节点的位置数,或 true 表示移动到第一个位置
返回值
Cake\Datasource\EntityInterface|false
抛出
Cake\Datasource\Exception\RecordNotFoundException
当节点未找到时
removeFromTree() ¶ public
removeFromTree(Cake\Datasource\EntityInterface $node): Cake\Datasource\EntityInterface|false
通过将当前节点定位为新的根并将所有子节点向上重新父级一层来从树中删除当前节点。
请注意,节点不会被删除,只是从其当前位置移开,而不会移动其子节点。
参数
-
Cake\Datasource\EntityInterface
$node 要从树中移除的节点
返回值
Cake\Datasource\EntityInterface|false
setConfig() ¶ public
setConfig(array<string, mixed>|string $key, mixed|null $value = null, bool $merge = true): $this
设置配置。
用法
设置特定值
$this->setConfig('key', $value);
设置嵌套值
$this->setConfig('some.nested.key', $value);
同时更新多个配置设置
$this->setConfig(['one' => 'value', 'another' => 'value']);
参数
-
array<string, mixed>|string
$key 要设置的键,或完整的配置数组。
-
混合|null
$value 可选 要设置的值。
-
bool
$merge optional 是否递归合并或覆盖现有配置,默认为 true。
返回值
$this
抛出
Cake\Core\Exception\CakeException
当尝试设置一个无效的键时。
verifyConfig() ¶ public
verifyConfig(): void
verifyConfig
检查实现的键是否包含指向可调用函数的值。
返回值
void
抛出
Cake\Core\Exception\CakeException
如果配置无效。
属性详情
$_reflectionCache ¶ protected static
行为的反射方法缓存。
存储每个类的反射方法+查找器方法。这可以防止在单个进程中多次反射同一个类。
类型
array<string, array>