thinktomorrow / vine

从一个相邻数据库结构生成树

0.4.11 2023-02-14 10:30 UTC

README

Build Status Coverage Status Scrutinizer Code Quality SensioLabsInsight

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()相同,但不会保持祖先结构。