记一次通过 Resource 递归生成树的方案
数据库结构
Model:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Menu extend Model {
protected $table = 'menus';
protected $fillable = ['name'];
public function children()
{
return $this->hasMany(Menu::class, 'parent_id');
}
public function scopeParents($query)
{
return $query->where('depth', 0);
}
}
Resource:
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class TreeResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'parentId' => $this->parent_id,
'name' => $this->name,
'children' => TreeResource::collection(
$this->children->load(['children' => function ($query) {
return $query->orderBy('sorter', 'asc');
}])
),
];
}
}
Controller:
namespace App\Http\Controllers;
use App\Http\Resources\TreeResource;
use App\Menu;
use Illuminate\Http\Request;
class StoreGroupController extends Controller
{
public function tree()
{
$parents = Menu::with([
'children' => function ($query) {
return $query->orderBy('sorter', 'asc'); // 排序
}])->parents()->orderBy('sorter', 'asc')->get();
return TreeResource::collection($parents);
}
}
采用
load()
减少每次递归时候的查询量可在闭包中添加排序规则
本作品采用《CC 协议》,转载必须注明作者和本文链接
这样不是在循环查数据库吗?为什么不能全部取出来在组装数据,,这样不就一条sql就搞定了?
博客:无限极分类
示例代码 明白意思就行,修改下就能用了,不用多次查询
使用了条件加载。当children不为空时才返回后代数据。不知这样是否可行