laravel无限级分类取所有下级的id/指定的字段/所有下级

注意:用于无限级分类、无限级分销等场景。

// 代码预览
<?php
namespace App\Http\Controllers;
public function sonUser() {
    //定义模型关联
    return $this->hasMany('App\Models\User', 'pid', 'id');
}

分享一小首歌曲


详细步骤

表设计

字段名 字段类型 字段说明
id int 表id
title varchar(36) 名称
pid int 父级id

模型设计

<?php

namespace App\Models;

use App\Models\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model{
    use SoftDeletes;
    public $timestamps = true;  //软删除
    protected $guarded = [];  //黑名单
    protected $table = 'users';  //表名
    
    
    public function sonUser() {
        //定义模型关联
        return $this->hasMany('App\Models\User', 'pid', 'id');
    }
    
    public function allSonUser()
    {
        //递归子用户
        return $this->sonUser()
            ->with('allSonUser')
            ->select(['id','pid','title']);  //此处的字段可根据表设计自行选择
    }
}

控制器中使用

<?php
namespace App\Http\Controllers;

use App\Models\User;

public function getAllSonId($id){
    $son =\App\Models\User::query()->with('allSonUser')->find($id)->allSonUser;   //此处find里的id为顶级用户id
    $son = json_decode(json_encode($son),true);  //转数组
    return get_user_id($son);
}

//指定需要的字段并序列化为一维数组
function get_user_id($users)
{
    $arr = [];
    array_walk_recursive($users,function ($v, $k) use(&$arr) {
        if($k == 'id')
            $arr[] = $v;
    });
    return $arr;
}