creocoder/yii2-nested-sets

为 Yii 框架提供嵌套集合行为

安装数: 4,043,013

依赖者: 101

建议者: 0

安全: 0

星标: 446

关注者: 52

分支: 129

开放问题: 37

类型:yii2-extension

0.9.0 2015-01-27 10:53 UTC

This package is not auto-updated.

Last update: 2024-09-17 17:51:08 UTC


README

Build Status Code Coverage Packagist Version Total Downloads

利用改进的前序遍历树算法为 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 的其他项目。

Support via Gratipay