matperez / yii2-materialized-path
The materialized path behavior for the Yii framework
Installs: 2 998
Dependents: 0
Suggesters: 0
Security: 0
Stars: 5
Watchers: 4
Forks: 3
Open Issues: 2
Type:yii2-extension
Requires
- yiisoft/yii2: ~2.0
Requires (Dev)
- codeception/codeception: ~2.1
- codeception/specify: ~0.4
- codeception/verify: ~0.2
- yiisoft/yii2-codeception: ~2.0
This package is not auto-updated.
Last update: 2025-04-08 06:36:53 UTC
README
Materialized Path Tree trait for Yii2 ActiveRecord.
Installation
The preferred way to install this extension is through composer.
Either run
$ composer require matperez/yii2-materialized-path
or add
"matperez/yii2-materialized-path": "*"
to the require
section of your composer.json
file.
Migrations
Run the following command
$ yii migrate/create create_tree_table
Open the /path/to/migrations/m_xxxxxx_xxxxxx_create_tree_table.php
file,
inside the up()
method add the following
$this->createTable('tree', [ 'id' => Schema::TYPE_PK, 'name' => Schema::TYPE_STRING.' NOT NULL', 'path' => Schema::TYPE_STRING.' NOT NULL DEFAULT \'.\'', 'position' => Schema::TYPE_INTEGER.' NOT NULL DEFAULT 0', 'level' => Schema::TYPE_INTEGER.' NOT NULL DEFAULT 0', ]);
Configuring
Configure model as follow:
use matperez\mp\MaterializedPathBehavior; use matperez\mp\MaterializedPathQuery; class Tree extends \yii\db\ActiveRecord { /** * @inheritdoc */ public function behaviors() { return [ [ 'class' => MaterializedPathBehavior::className(), ], ]; } /** * @inheritdoc */ public function rules() { return [ [['position', 'level'], 'integer'], [['path'], 'string', 'max' => 255] ]; } /** * Query factory * @return MaterializedPathQuery */ public static function find() { return new MaterializedPathQuery(get_called_class()); } }
Usage
Making a root node
To make a root node
$root = new Tree(['name' => 'root']); $root->makeRoot();
The tree will look like this
- root
Appending a node as the child of another node
To prepend a node as the first child of another node
$child = new Tree(['name' => 'child']); $child->appendTo($root);
The tree will look like this
- root
- child
Move node up and down among siblings
$node = Tree::findOne(['name' => 'child']); // move node up $node->setPosition($node->position - 1); // move node down $node->setPosition($node->position + 1);
Getting the root nodes
To get all the root nodes
$roots = Tree::find()->roots()->all();
Getting children of a node
To get all the children of a node
$root = Tree::find()->roots()->one(); foreach($root->children as $child) { foreach($child->children as $subchild) { // do the things with a subchild } }
Getting parents of a node
To get all the parents of a node
$node = Tree::findOne(['name' => 'child']); $parents = Tree::find()->andWhere(['id' => $node->parentIds])->all();
To get the first parent of a node
$node = Tree::findOne(['name' => 'child']); $parent = $node->parent();
Delete node with children
To delete node with children
$node->delete();
Testing
./vendor/bin/codeception build
./vendor/bin/codeception run unit
Todo
more tests, mode examples