thinktomorrow / vine
从一个相邻数据库结构生成树
0.4.11
2023-02-14 10:30 UTC
Requires
- php: >=8.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.14.3
- phpstan/phpstan: ^1.9.14
- phpunit/phpunit: ^9.6.0
README
Vine
将相邻的数据模型渲染为所需的HTML输出。
创建单个节点
// Create a node and attach a child node ot it $node = new Node('foobar'); $node->addChildren(new Node('fooberry'));
当处理小型、孤立的数据集时,这是可以的。当你需要注入大量记录时,你将想要一次性加载所有这些数据。
使用数据集
通常,你会想使用一个从数据库中获取值的集合。两种方法提供了这种功能:`NodeCollection::fromArray()` 和 `NodeCollection::fromSource()` 允许你一次性将整个记录数组转换到节点集合。
当使用 `NodeCollection::fromArray()` 时,假设每个记录具有以下内容
- 一个 `id` 属性,它提供了一个对条目的唯一引用。
- 一个 `parent_id` 属性,它被子条目用来引用其父条目。
// flat dataset as pulled from database $dataset = [ ['id' => 1, 'parent_id' => 0, 'label' => 'foobar'], ['id' => 2, 'parent_id' => 1, 'label' => 'baz'], ['id' => 3, 'parent_id' => 2, 'label' => 'bazbaz'], ]; $collection = NodeCollection::fromArray($dataset);
使用自定义数据集
你可以提供自定义数据源。以下是如何使用它的示例
// Using a custom source $collection = NodeCollection::fromSource( new ArraySource($dataset) );
这对于数据不包含默认的 `id` 或 `parent_id` 属性的情况很有用。使用自定义源,你可以设置哪个是 `nodeKeyIdentifier`(id)和 `nodeParentKeyIdentifier`(父id)。自定义源应该遵守 `\Vine\Source` 接口
interface Source { // array of all entries. public function nodeEntries(): array; // property to identify the key (default is 'id') public function nodeKeyIdentifier(): string; // property to identify the parent key (default is 'parent_id') public function nodeParentKeyIdentifier(): string; }
节点集合Api
- all(): array - 返回所有节点作为数组
- first(): ?Node - 返回第一个节点
- last(): ?Node - 返回最后一个节点
- isEmpty(): bool - 检查此集合是否为空。
- findMany($key, array $values): NodeCollection - 根据值查找节点。
- find($key, $value): ?Node - 根据值查找节点。
- total(): int - 所有节点的总数,包括它们的子节点。
- count(): int - 所有顶级节点的总数。
- add(Node ...$nodes) - 向集合添加新的 Node
- merge(NodeCollection $nodeCollection) - 将另一个集合合并到这个集合中。
- map(callable $callback) - 遍历并修改每个顶级节点值
- mapRecursive(callable $callback) - 遍历并修改每个节点值
- each(callable $callback) - 遍历每个顶级节点值
- sort($key) - 根据给定键对所有节点进行排序
- copy($depth = null): NodeCollection - 将集合复制到新的 NodeCollection
- remove(Node $child) - 从此集合中删除指定的 Node。
- flatten(): NodeCollection - 返回此集合中所有节点的扁平列表。
- inflate(): NodeCollection - 将扁平集合恢复到其原始结构。
- pluck($key, $value = null, $down = true): array - 从子节点获取平展的值数组。
- slice(Node ...$nodes): NodeCollection - 从集合中切出一个或多个节点。
- shake(callable $callback): NodeCollection - 过滤集合以保留通过回调的节点(摇动集合将保留祖先结构)。
- prune(callable $callback): NodeCollection - 与 shake() 相同,但它不会保留祖先结构。
节点Api
- equals(Node $other) - 检查给定的节点是否与这个节点相同对象
- addChildren($children) - 将节点添加为此节点的子节点。
- children(): NodeCollection - 获取此节点的直接子节点。
- hasChildren(): bool - 检查此节点是否有任何子节点。
- sort($key) - 根据给定的排序键对子节点进行排序。
- entry($key = null, $default = null) - 返回数据条目或条目的给定属性。
- replaceEntry($entry) - 用给定参数替换条目数据。
- parent(Node $parent = null) - 返回父节点,如果传递了参数,则为当前节点设置父节点。
- remove(Node $node = null) - 移除此节点或断开子节点。
- move(Node $parent) - 将子节点移动到不同的父节点。
- moveToRoot() - 将节点移动到顶级。
- depth(): int - 此节点在整棵树中的深度。
- count(): int - 返回所有直接子节点的数量。
- total(): int - 返回所有子节点的总数。
- isLeaf(): bool - 此节点是叶子节点吗?意味着它没有子节点。
- isRoot(): bool - 此节点是根节点吗?意味着它没有父节点。
- has($key, $value): bool - 节点数据中是否有给定值?
- findMany($key, array $values): NodeCollection - 根据给定值查找子节点。
- find($key, $value): ?Node - 根据给定值查找子节点。
- ancestors($depth = null): NodeCollection - 返回此节点的所有祖先节点。
- pluck($key, $value = null, $down = true): array - 从子节点获取平展的值数组。
- pluckAncestors($key, $value = null, $down = true): array - 从父节点获取平铺值的数组。
- copy($depth = null): Node - 创建并返回此节点的副本。
- isolatedCopy(): Node - 创建并返回此节点的副本,不包含父节点或子节点关系。
- shake(callable $callback): Node - 过滤集合,以通过回调的节点(摇动集合将保持祖先结构)。
- prune(callable $callback): Node - 与shake()相同,但不会保持祖先结构。