bootpress / hierarchy
Nested Set benefits with Adjacency List effort. Retrieve the children, counts, levels, paths, trees, nests, and leaves from your category nodes.
Installs: 1 016
Dependents: 2
Suggesters: 0
Security: 0
Stars: 1
Watchers: 2
Forks: 1
Open Issues: 0
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-12-21 21:03:10 UTC
README
The BootPress Hierarchy Component bridges the gap between Adjacency lists, and the Nested Set Model so that you can have both the simplicity of Adjacency lists, with the power and efficiency of Nested sets.
Installation
Add the following to your composer.json
file.
{ "require": { "bootpress/hierarchy": "^1.0" } }
Example Usage
<?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');
The $db table must have the 'parent', 'level', 'lft', and 'rgt' fields for everything to work. All you need to worry about is the 'id' and 'parent'. This class will take care of the rest. When you get things all set up, and whenever you make any changes:
$hier->refresh();
That will create and update the nested sets info from your 'id' and 'parent' fields. To delete a node and all of it's children you can:
print_r($hier->delete(11)); // array(11, 12, 13, 14, 15) $hier->refresh(); // don't forget to do this!
You just removed "Apple in California", and everything associated with them.
// 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), )
License
The MIT License (MIT). Please see License File for more information.