Laravel中如何将companies表数据按idParent分组排序
方案1:SQL层面直接排序(推荐,性能更高)
直接通过排序规则实现需求,不需要额外处理查询结果,适合数据量较大的场景:
Company::orderByRaw('COALESCE(idParent, id) ASC') // 父级排序在前,子级在后 ->orderByRaw('idParent IS NOT NULL ASC') // 同层级可自定义排序规则,示例按id升序,可替换为created_at、companyName等字段 ->orderBy('id', 'ASC') ->get();
排序逻辑说明:
- 第一维度用
COALESCE(idParent, id):父级公司idParent为null,所以取自身id作为排序值;子级公司取关联的父级id作为排序值,保证父子公司分到同一组 - 第二维度判断是否为子级:布尔值false对应0、true对应1,升序排序后父级会排在同组最前面
方案2:集合处理+关联关系(灵活度更高,适合层级扩展)
首先在Company模型中定义父子关联:
public function parent() { return $this->belongsTo(Company::class, 'idParent'); } public function children() { return $this->hasMany(Company::class, 'idParent'); }
查询时先获取所有父级,再拼接对应子级:
$companies = collect(); // 获取所有父级公司,按自定义规则排序 $parentList = Company::whereNull('idParent')->orderBy('id')->get(); foreach ($parentList as $parent) { $companies->push($parent); // 拼接当前父级的所有子级 $companies = $companies->merge($parent->children()->orderBy('id')->get()); }
该方案后续如果需要返回树形嵌套结构、或者扩展多级公司层级,只需要微调关联加载逻辑即可。
内容的提问来源于stack exchange,提问作者Michel Silva
相关产品推荐
相关产品推荐

