You need to enable JavaScript to run this app. Codeigniter中如何在select查询内嵌套另一个select查询获取关联表数据
优惠活动
大模型
产品
解决方案
定价
更多

Codeigniter中如何在select查询内嵌套另一个select查询获取关联表数据

存在的问题

  • 控制器返回的$data['options']是二维数组:你循环每个问题查询对应的选项,把每个问题的选项结果集直接塞到$items_arr里,最终$options的结构是[ 0=>[问题1的所有选项对象], 1=>[问题2的所有选项对象]... ],视图里直接遍历$options拿到的每个元素是数组,不是选项对象,自然拿不到o_question_id属性。
  • 视图字段名和变量写错:
    1. 输出问题标题时写的$q_title,正确写法是$q->q_title
    2. 匹配条件里写的$q->id,你的问题表主键是q_id,正确写法是$q->q_id
  • 现有控制器逻辑存在N+1查询问题,数据量大时性能很差。

修正方案

方案1:最小改动适配现有逻辑

控制器修正

调整选项数组的存储结构,用问题ID作为键方便视图直接取值:

/* controller */
$data['questions'] = $this->db->get('questions_tbl')->result();
$items_arr = array();
foreach ($data['questions'] as $q) {
    $items_arr[$q->q_id] = $this->db->where('o_question_id', $q->q_id)->get('options_tbl')->result();
}
$data['options'] = $items_arr;

视图修正

直接取当前问题对应的选项遍历,不需要额外判断:

/* view */
<?php foreach ($questions as $q) { ?>
    <strong><?= $q->q_id ?>.<?= $q->q_title ?></strong>
    <?php foreach ($options[$q->q_id] as $o) { ?>
        <p><?= $o->o_title ?></p>
    <?php } ?>
<?php } ?>

方案2:优化查询效率(推荐)

仅需2次查询即可拿到所有数据,避免N+1问题:

/* 优化后控制器 */
// 第一次查询所有问题
$data['questions'] = $this->db->get('questions_tbl')->result();
// 第二次查询所有选项
$all_options = $this->db->get('options_tbl')->result();
// 按问题ID分组组装选项
$options_map = [];
foreach ($all_options as $o) {
    $options_map[$o->o_question_id][] = $o;
}
$data['options'] = $options_map;

视图代码和方案1完全一致即可。

内容的提问来源于stack exchange,提问作者POPI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 10:21:00