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

Laravel实现多列排序:先按整数列再按字符串列排序

需求与解决方案

当前问题

你目前通过device.sort_order字段对设备部件列表排序,现有代码如下:

$parts = \App\DevicePart::with('device')->get()->sortBy('device.sort_order')->values();

@foreach($parts as $i)
  {{ $i->device->sort_order }} - {{ $i->title }}
@endforeach

当前输出结果:

1 - Carga
1 - Baseband
2 - Baseband
2 - Conectores
2 - Camera

需要在保留device.sort_order排序优先级的前提下,按title字段的字母顺序进行二次排序,得到目标结果:

1 - Baseband
1 - Carga
2 - Baseband
2 - Camera
2 - Conectores

实现方法

方法1:数据库层面排序(推荐)

直接在Eloquent查询阶段完成多字段排序,利用数据库的关联查询和orderBy,性能更优(尤其数据量大时):

$parts = \App\DevicePart::with('device')
    ->join('devices', 'device_parts.device_id', '=', 'devices.id')
    ->orderBy('devices.sort_order', 'asc')
    ->orderBy('device_parts.title', 'asc')
    ->select('device_parts.*') // 避免关联表字段冲突
    ->get();

方法2:集合层面多字段排序

如果需要在PHP集合中处理排序,可以给sortBy方法传递包含多个排序规则的数组,先按device.sort_order排序,再按title排序:

$parts = \App\DevicePart::with('device')
    ->get()
    ->sortBy([
        ['device.sort_order', 'asc'],
        ['title', 'asc']
    ])
    ->values();

两种方法对比:方法1由数据库处理排序,效率更高;方法2适合数据量较小的场景,在内存中完成二次排序。

内容的提问来源于stack exchange,提问作者anderlaini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:15:59