树形表模型

优质
小牛编辑
133浏览
2023-12-01

介绍

我们开发中有一些表是树形结构的,比如地区、分销关系等。imi 特地为此做了增强支持,可以非常方便地操作树形结构的数据表。

定义模型

引入 traitImi\Model\Tree\TTreeModel

类上加上 @TreeModel 注解,类:Imi\Model\Tree\Annotation\TreeModel

属性名称说明
idField主键字段名,默认为null,则自动获取
parentField父级ID字段名
childrenField子集字段名
<?php
namespace Imi\Test\Component\Model;

use Imi\Model\Model;
use Imi\Model\Tree\TTreeModel;
use Imi\Model\Annotation\Table;
use Imi\Model\Annotation\Column;
use Imi\Model\Annotation\Entity;
use Imi\Model\Tree\Annotation\TreeModel;
use Imi\Test\Component\Model\Base\TreeBase;

/**
 * Tree
 * @Entity
 * @TreeModel(parentField="parent_id", childrenField="children")
 * @Table(name="tb_tree", id={"id"})
 */
class Tree extends TreeBase // TreeBase 为通过 generate/model 工具生成出来的基类
{
    use TTreeModel;

    /**
     * 子节点集合
     * 
     * @Column(virtual=true)
     *
     * @var static[]
     */
    protected $children = [];

    /**
     * Get 子节点集合
     *
     * @return static[]
     */ 
    public function &getChildren()
    {
        return $this->children;
    }

    /**
     * Set 子节点集合
     *
     * @param static[] $children
     *
     * @return self
     */ 
    public function setChildren($children)
    {
        $this->children = $children;

        return $this;
    }

}

使用

方法列表

getChildIds

获取一级子节点的ID们

$item = Tree::find(1);
$ids = $item->getChildIds(); // 当前对象子节点
$ids = $item->getChildIds(123); // 指定 ID 子节点

getChildrenIds

获取下属 N 级子节点的ID

非递归实现,相比递归实现性能更高,更省内存

$item = Tree::find(1);
$item->getChildrenIds(null, true); // 包含父级ID(1)
$item->getChildrenIds(); // 不包含父级ID(1)
$item->getChildrenIds(123, false, 1); // 不包含父级ID(123),限制获取子层级为1级

getChildrenList

获取子成员对象列表,可以指定层级,默认无限级

$item = Tree::find(1);
$tree = $item->getChildrenList(); // 获取父级ID(1)下所有记录
$tree = $item->getChildrenList(null, 1); // 获取父级ID(1)下所有记录,层级1级
$tree = $item->getChildrenList(123, 1); // 获取父级ID(123)下所有记录,层级1级

getParent

获取父级对象

$item = Tree::find(1);
$parentItem = $item->getParent();

getParents

获取所有父级对象列表

$item = Tree::find(1);
$parentItemList = $item->getParents();

getAssocList

获取关联列表,@TreeModel注解中配置的childrenField属性生效,放入配置的属性中

$list = Tree::getAssocList(); // 所有数据

// 指定只显示 ID 为 1、2、3 的数据,他们之间如果有上下级关系,会在 children 属性中体现
$query = Tree::query()->whereIn('id', [1, 2, 3]);
$list = Tree::getAssocList($query);
$children = $list[0]->children; // $children 与 $list 结构相同