TreeModel

介绍

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

定义模型

  1. <?php
  2. namespace Imi\Test\Component\Model;
  3. use Imi\Model\Model;
  4. use Imi\Model\Tree\TTreeModel;
  5. use Imi\Model\Annotation\Table;
  6. use Imi\Model\Annotation\Column;
  7. use Imi\Model\Annotation\Entity;
  8. use Imi\Model\Tree\Annotation\TreeModel;
  9. use Imi\Test\Component\Model\Base\TreeBase;
  10. /**
  11. * Tree
  12. * @Entity
  13. * @TreeModel(parentField="parent_id", childrenField="children")
  14. * @Table(name="tb_tree", id={"id"})
  15. */
  16. class Tree extends TreeBase // TreeBase 为通过 generate/model 工具生成出来的基类
  17. {
  18. use TTreeModel;
  19. /**
  20. * 子节点集合
  21. *
  22. * @Column(virtual=true)
  23. *
  24. * @var static[]
  25. */
  26. protected $children = [];
  27. /**
  28. * Get 子节点集合
  29. *
  30. * @return static[]
  31. */
  32. public function &getChildren()
  33. {
  34. return $this->children;
  35. }
  36. /**
  37. * Set 子节点集合
  38. *
  39. * @param static[] $children
  40. *
  41. * @return self
  42. */
  43. public function setChildren($children)
  44. {
  45. $this->children = $children;
  46. return $this;
  47. }
  48. }

使用

方法列表

getChildIds

获取一级子节点的ID们

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

getChildrenIds

获取下属 N 级子节点的ID

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

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

getChildrenList

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

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

getParent

获取父级对象

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

getParents

获取所有父级对象列表

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

getAssocList

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

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