无限极分类:方法一,原生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