creocoder / yii2-nested-sets
为 Yii 框架提供嵌套集合行为
0.9.0
2015-01-27 10:53 UTC
Requires
- yiisoft/yii2: *
This package is not auto-updated.
Last update: 2024-09-17 17:51:08 UTC
README
利用改进的前序遍历树算法为 Yii 框架提供现代嵌套集合行为。
安装
安装此扩展的首选方式是通过 composer。
运行以下命令
$ composer require creocoder/yii2-nested-sets
或者
"creocoder/yii2-nested-sets": "0.9.*"
将以下内容添加到您的 composer.json
文件的 require
部分。
迁移
运行以下命令
$ yii migrate/create create_menu_table
打开 /path/to/migrations/m_xxxxxx_xxxxxx_create_menu_table.php
文件,在 up()
方法中添加以下内容
$this->createTable('{{%menu}}', [ 'id' => $this->primaryKey(), //'tree' => $this->integer()->notNull(), 'lft' => $this->integer()->notNull(), 'rgt' => $this->integer()->notNull(), 'depth' => $this->integer()->notNull(), 'name' => $this->string()->notNull(), ]);
要使用多树模式,取消注释 tree
字段。
配置
按照以下方式配置模型
use creocoder\nestedsets\NestedSetsBehavior; class Menu extends \yii\db\ActiveRecord { public function behaviors() { return [ 'tree' => [ 'class' => NestedSetsBehavior::className(), // 'treeAttribute' => 'tree', // 'leftAttribute' => 'lft', // 'rightAttribute' => 'rgt', // 'depthAttribute' => 'depth', ], ]; } public function transactions() { return [ self::SCENARIO_DEFAULT => self::OP_ALL, ]; } public static function find() { return new MenuQuery(get_called_class()); } }
要使用多树模式,取消注释 behaviors()
方法内的 treeAttribute
数组键。
按照以下方式配置查询类
use creocoder\nestedsets\NestedSetsQueryBehavior; class MenuQuery extends \yii\db\ActiveQuery { public function behaviors() { return [ NestedSetsQueryBehavior::className(), ]; } }
用法
创建根节点
要创建根节点
$countries = new Menu(['name' => 'Countries']); $countries->makeRoot();
树将看起来像这样
- Countries
将一个节点作为另一个节点的第一个子节点添加到前缀
要将一个节点作为另一个节点的第一个子节点添加到前缀
$russia = new Menu(['name' => 'Russia']); $russia->prependTo($countries);
树将看起来像这样
- Countries
- Russia
将一个节点作为另一个节点的最后一个子节点添加到后缀
要将一个节点作为另一个节点的最后一个子节点添加到后缀
$australia = new Menu(['name' => 'Australia']); $australia->appendTo($countries);
树将看起来像这样
- Countries
- Russia
- Australia
在另一个节点之前插入一个节点
要在另一个节点之前插入一个节点
$newZeeland = new Menu(['name' => 'New Zeeland']); $newZeeland->insertBefore($australia);
树将看起来像这样
- Countries
- Russia
- New Zeeland
- Australia
在另一个节点之后插入一个节点
要在另一个节点之后插入一个节点
$unitedStates = new Menu(['name' => 'United States']); $unitedStates->insertAfter($australia);
树将看起来像这样
- Countries
- Russia
- New Zeeland
- Australia
- United States
获取根节点
要获取所有根节点
$roots = Menu::find()->roots()->all();
获取叶子节点
要获取所有叶子节点
$leaves = Menu::find()->leaves()->all();
要获取节点的所有叶子节点
$countries = Menu::findOne(['name' => 'Countries']); $leaves = $countries->leaves()->all();
获取节点的子节点
要获取节点的所有子节点
$countries = Menu::findOne(['name' => 'Countries']); $children = $countries->children()->all();
要获取节点的第一级子节点
$countries = Menu::findOne(['name' => 'Countries']); $children = $countries->children(1)->all();
获取节点的父节点
要获取节点的所有父节点
$countries = Menu::findOne(['name' => 'Countries']); $parents = $countries->parents()->all();
要获取节点的第一个父节点
$countries = Menu::findOne(['name' => 'Countries']); $parent = $countries->parents(1)->one();
捐赠
通过 gratipay 支持此项目及 creocoder 的其他项目。