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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:58:10