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
相关产品推荐
相关产品推荐

