bootpress / hierarchy
嵌套集与邻接表结合的优势。从您的分类节点中检索子节点、数量、级别、路径、树、嵌套和叶子。
v1.0
2016-09-28 11:02 UTC
Requires
- php: >=5.4
- bootpress/database: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^1.0
- phpunit/phpunit: ^4.0
- squizlabs/php_codesniffer: ^2.5
This package is not auto-updated.
Last update: 2024-09-14 19:47:47 UTC
README
BootPress Hierarchy 组件在邻接列表和嵌套集模型之间架起桥梁,以便您同时拥有邻接列表的简单性和嵌套集的强大功能和效率。
安装
将以下内容添加到您的 composer.json
文件中。
{ "require": { "bootpress/hierarchy": "^1.0" } }
示例用法
<?php use BootPress\Database\Component as Database; use BootPress\Hierarchy\Component as Hierarchy; $db = new Database('sqlite::memory:'); $db->exec(array( 'CREATE TABLE category (', ' id INTEGER PRIMARY KEY,', ' name TEXT NOT NULL DEFAULT "",', ' parent INTEGER NOT NULL DEFAULT 0,', ' level INTEGER NOT NULL DEFAULT 0,', ' lft INTEGER NOT NULL DEFAULT 0,', ' rgt INTEGER NOT NULL DEFAULT 0', ')', )); if ($stmt = $db->insert('category', array('id', 'name', 'parent'))) { $db->insert($stmt, array(1, 'Electronics', 0)); $db->insert($stmt, array(2, 'Televisions', 1)); $db->insert($stmt, array(3, 'Tube', 2)); $db->insert($stmt, array(4, 'LCD', 2)); $db->insert($stmt, array(5, 'Plasma', 2)); $db->insert($stmt, array(6, 'Portable Electronics', 1)); $db->insert($stmt, array(7, 'MP3 Players', 6)); $db->insert($stmt, array(8, 'Flash', 7)); $db->insert($stmt, array(9, 'CD Players', 6)); $db->insert($stmt, array(10, '2 Way Radios', 6)); $db->insert($stmt, array(11, 'Apple in California', 1)); $db->insert($stmt, array(12, 'Made in USA', 11)); $db->insert($stmt, array(13, 'Assembled in China', 11)); $db->insert($stmt, array(14, 'iPad', 13)); $db->insert($stmt, array(15, 'iPhone', 13)); $db->close($stmt); } $hier = new Hierarchy($db, 'category', 'id');
$db 表必须包含 'parent', 'level', 'lft', 和 'rgt' 字段,以便一切正常工作。您只需要关注 'id' 和 'parent'。此类将处理其余部分。当您一切设置完毕,以及您进行任何更改时
$hier->refresh();
这将根据您的 'id' 和 'parent' 字段创建和更新嵌套集信息。要删除节点及其所有子节点,您可以
print_r($hier->delete(11)); // array(11, 12, 13, 14, 15) $hier->refresh(); // don't forget to do this!
您刚刚删除了 "加利福尼亚的苹果",以及与之相关的所有内容。
// Get the id of a given path echo $hier->id('name', array('Electronics', 'Portable Electronics', 'CD Players')); // 9 // Retrieve a single path print_r($hier->path('name', 'Flash')); /* array( 1 => 'Electronics', 6 => 'Portable Electronics', 7 => 'MP3 Players', 8 => 'Flash', ) */ // Aggregate the total records in a table for each tree node $db->exec(array( 'CREATE TABLE products (', ' id INTEGER PRIMARY KEY,', ' category_id INTEGER NOT NULL DEFAULT 0,', ' name TEXT NOT NULL DEFAULT ""', ')', )); if ($stmt = $db->insert('products', array('category_id', 'name'))) { $db->insert($stmt, array(3, '20" TV')); $db->insert($stmt, array(3, '36" TV')); $db->insert($stmt, array(4, 'Super-LCD 42"')); $db->insert($stmt, array(5, 'Ultra-Plasma 62"')); $db->insert($stmt, array(5, 'Value Plasma 38"')); $db->insert($stmt, array(7, 'Power-MP3 128mb')); $db->insert($stmt, array(8, 'Super-Shuffle 1gb')); $db->insert($stmt, array(9, 'Porta CD')); $db->insert($stmt, array(9, 'CD To go!')); $db->insert($stmt, array(10, 'Family Talk 360')); $db->close($stmt); } print_r($hier->counts('products', 'category_id')); /* array( // id => count 1 => 10, // Electronics 2 => 5, // Televisions 3 => 2, // Tube 4 => 1, // LCD 5 => 2, // Plasma 6 => 5, // Portable Electronics 7 => 2, // MP3 Players 8 => 1, // Flash 9 => 2, // CD Players 10 => 1 // 2 Way Radios ) */ // Retrieve a tree $tree = $hier->tree('name', 'id', 6); print_r($tree); /* array( 6 => array('name' => 'Portable Electronics', 'parent' => 1, 'depth' => 0), 7 => array('name' => 'MP3 Players', 'parent' => 6, 'depth' => 1), 8 => array('name' => 'Flash', 'parent' => 7, 'depth' => 2), 9 => array('name' => 'CD Players', 'parent' => 6, 'depth' => 1), 10 => array('name' => '2 Way Radios', 'parent' => 6, 'depth' => 1), ) */ // Flatten it $nest = $hier->nestify($tree); var_export($hier->flatten($nest)); array( array(6, 7, 8), array(6, 9), array(6, 10), )
许可
MIT 许可证(MIT)。有关更多信息,请参阅许可文件。