You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:57:02