如何在CodeIgniter中调整模型函数,返回指定结构的数组
CodeIgniter模型函数:生成指定嵌套数组格式的解决方案
你现在的问题核心是数组结构拼接逻辑错误:当前代码用array_merge($row, $final)会把事件数组直接合并到speaker的行数据里,既没法形成events嵌套数组,也缺少最终需要的顶级speakers键。我帮你修改代码,完全匹配你要的格式:
function speakers() { // 初始化最终结构,包含需要的顶级speakers键 $data = ['speakers' => []]; $speakers = $this->db->get("speakers_tbl"); if($speakers->num_rows() > 0) { foreach ($speakers->result_array() as $row) { // 查询当前演讲者对应的所有事件 $events = $this->db->where('speaker_id', $row['id']) ->get('events_tbl') ->result_array(); // 构建单个演讲者的完整结构:保留原数据,添加events嵌套数组 $speaker_item = $row; $speaker_item['events'] = $events; // 如果你的speakers_tbl表中没有status字段,可以手动赋值:$speaker_item['status'] = 'Active'; // 将构建好的演讲者对象加入目标数组 $data['speakers'][] = $speaker_item; } } return $data; }
关键修改说明
- 顶级结构修正:一开始就初始化
$data = ['speakers' => []],确保最终返回的数组符合你需要的外层结构。 - 嵌套结构修正:不再用
array_merge强行合并数据,而是给每个演讲者的行数据单独添加events键,把查询到的事件数组赋值给它,完美实现嵌套格式。 - 代码简化:把事件查询改成链式调用,更简洁易读。
性能优化建议(可选)
如果你的数据量较大,当前循环中每次查询事件会造成N+1查询问题(1次查演讲者,N次查对应事件),可以用关联查询优化,只执行1次数据库查询再整理结构:
function speakers() { $this->db->select('s.id as speaker_id, s.name as speaker_name, s.status, e.id as event_id, e.name as event_name'); $this->db->from('speakers_tbl s'); $this->db->join('events_tbl e', 's.id = e.speaker_id', 'left'); $query = $this->db->get(); $result = ['speakers' => []]; $speakerMap = []; foreach ($query->result_array() as $row) { $speakerId = $row['speaker_id']; if (!isset($speakerMap[$speakerId])) { // 初始化演讲者对象 $speakerMap[$speakerId] = [ 'id' => $speakerId, 'name' => $row['speaker_name'], 'status' => $row['status'], 'events' => [] ]; $result['speakers'][] = &$speakerMap[$speakerId]; } // 若存在对应事件,添加到events数组 if (!empty($row['event_id'])) { $speakerMap[$speakerId]['events'][] = [ 'id' => $row['event_id'], 'name' => $row['event_name'] ]; } } return $result; }
内容的提问来源于stack exchange,提问作者user13308216
相关产品推荐
相关产品推荐

