Laravel中按order子键排序JSONB对象的问题排查
问题分析
你的排序代码未生效的核心原因是:你在fieldData的顶层遍历查找section_开头的键,但实际所有section_xxx区块都嵌套在tab_patient、tab-admission这类tab子对象内部,原代码根本没定位到需要排序的目标区块。
修正后的代码
class FieldSettingResource extends JsonResource { public function toArray(Request $request): array { $fieldData = $this->field_data; // 遍历每个tab对象 foreach ($fieldData as $tabKey => $tabContent) { // 跳过非数组格式的tab内容(容错判断) if (!is_array($tabContent)) { continue; } // 拆分tab内的section区块和其他属性 $sections = []; $nonSections = []; foreach ($tabContent as $key => $value) { if (strpos($key, 'section_') === 0) { $sections[$key] = $value; } else { // 保留tab的原有属性(如label、show) $nonSections[$key] = $value; } } // 按order字段对section排序,兼容order不存在的情况 uasort($sections, function ($a, $b) { $orderA = $a['order'] ?? PHP_INT_MAX; $orderB = $b['order'] ?? PHP_INT_MAX; return $orderA <=> $orderB; }); // 重组tab内容:先放原有属性,再放排序后的sections $fieldData[$tabKey] = array_merge($nonSections, $sections); } return [ 'id' => (string)$this->id, 'name' => $this->name, 'field_data' => $fieldData, ]; } }
关键说明
- 新增tab层级遍历,准确定位到section所在的嵌套层级
- 拆分并重组tab内容,保证tab原有属性不丢失,同时让排序后的section按顺序排列
- 增加
order字段不存在的容错处理,避免数据异常导致的报错
内容的提问来源于stack exchange,提问作者morne
相关产品推荐
相关产品推荐

