如何自定义调整Laravel QueryBuilder返回结果的数组排列顺序
Laravel调整查询结果数组键顺序的实现方法
无需编写复杂的自定义函数,使用Laravel自带的集合方法结合PHP原生数组操作即可快速实现需求,具体方案如下:
步骤1:定义期望的键顺序
首先按照你需要的排列顺序,提前定义好键名列表:
$desiredKeys = [ 'outsourcer', 'manager_name', 'worker_name', 'sesnum1', 'sesnum2', 'start', 'end', 'work', 'quarter', 'working_period', 'reserve1', 'cost', 'worktime_l', 'worktime_h', 'cost_add', 'cost_trip', 'cost_trip_terms', 'cost_midnight', 'cost_reduced', 'reserve2', 'end_date' ];
步骤2:按顺序重组数组
场景1:处理多条查询结果(QueryBuilder调用get()返回的集合)
// 你的原始查询逻辑 $originalData = DB::table('你的表名')->where('你的条件')->get(); $sortedData = $originalData->map(function ($item) use ($desiredKeys) { // 将对象转为数组 $itemArr = (array)$item; $sortedItem = []; // 按指定顺序填充数组 foreach ($desiredKeys as $key) { $sortedItem[$key] = $itemArr[$key]; } return $sortedItem; });
场景2:处理单条查询结果(QueryBuilder调用first()返回的对象)
// 你的原始查询逻辑 $originalItem = DB::table('你的表名')->where('你的条件')->first(); $itemArr = (array)$originalItem; $sortedItem = []; foreach ($desiredKeys as $key) { $sortedItem[$key] = $itemArr[$key]; }
简化写法
可以用PHP原生array_replace方法替代循环,代码更简洁:
// 单条场景替换逻辑 $sortedItem = array_replace(array_flip($desiredKeys), (array)$originalItem); // 多条场景替换逻辑 $sortedData = $originalData->map(fn($item) => array_replace(array_flip($desiredKeys), (array)$item));
复用封装(可选)
如果多个业务场景都需要用到这个键排序逻辑,可以将其封装为集合宏,在app/Providers/AppServiceProvider.php的boot方法中添加以下代码:
use Illuminate\Support\Collection; public function boot() { Collection::macro('sortByCustomKeyOrder', function (array $desiredKeys) { return $this->map(fn($item) => array_replace(array_flip($desiredKeys), (array)$item)); }); }
后续使用时直接调用即可:
$sortedData = $originalData->sortByCustomKeyOrder($desiredKeys);
内容的提问来源于stack exchange,提问作者Patas
相关产品推荐
相关产品推荐

