无限极分类:方法一,原生model
在模型中定义如下:
// 获取下一级分类
public function children()
{
return $this->hasMany(self::class, 'pid', 'id');
}
// 获取所有的下级分类
public function allChildren()
{
return $this->children()->with('allChildren')->orderBy('level', 'asc');
}
在控制器中使用:
$data = CrmTag::query()
->with('allChildren')
->where(['pid' => 0, 'level' => 1, 'name' => '基本信息标签'])
->get()
->toArray();
# 如果需要获取所有的子菜单ID,将这个数组扁平化成一维数组
public function flattenMenus(array $menus, $children_key = 'children', array &$result = [])
{
foreach ($menus as $menu) {
// 将当前菜单项添加到结果中
$item = $menu;
unset($item[$children_key]); // 移除嵌套结构
$result[] = $item;
// 如果有子菜单,递归调用
if (!empty($menu[$children_key])) {
$this->flattenMenus($menu[$children_key], $children_key, $result);
}
}
return $result;
}
$allMenus = $this->flattenMenus($data, 'all_children');
$menu_ids = array_column($allMenus, 'id');
无限极分类:方法二
/**
* Description: 获取等级树
* Author: Shuxiaoyuan
* Email: sxy@shuxiaoyuan.com
* DateTime: 2022/2/22 16:31
*
* @param array $array 无限极分类数组
* @param string $id_key 分类ID(主键ID)
* @param string $pid_key 父级ID(pid)
* @param string $key_name key名(下一级的键名)
*
* @return array
*/
public static function getLevelTree(array $array, string $id_key, string $pid_key, string $key_name): array
{
$items = [];
foreach ($array as $v) {
$items[$v[$id_key]] = $v;
}
$tree = [];
foreach ($items as $k => $item) {
if (isset($items[$item[$pid_key]])) {
$items[$item[$pid_key]][$key_name][] = &$items[$k];
} else {
$tree[] = &$items[$k];
}
}
return $tree;
}
获取无限极分类最后的分类id
有数据如下
# 亲测可用
$pid = CrmTag::query()
->with('allChildren')
->where(['pid' => 0, 'level' => 1, 'name' => '基本信息标签'])
->get()
->toArray();
$collection = collect($pid)->pluck('all_children.*.all_children')->flatten(2)->pluck('id');
dd($collection);
结果如图所示:
- 参考文档:https://segmentfault.com/q/1010000039376858?utm_source=tag-newest