Codeigniter中如何在select查询内嵌套另一个select查询获取关联表数据
存在的问题
- 控制器返回的
$data['options']是二维数组:你循环每个问题查询对应的选项,把每个问题的选项结果集直接塞到$items_arr里,最终$options的结构是[ 0=>[问题1的所有选项对象], 1=>[问题2的所有选项对象]... ],视图里直接遍历$options拿到的每个元素是数组,不是选项对象,自然拿不到o_question_id属性。 - 视图字段名和变量写错:
- 输出问题标题时写的
$q_title,正确写法是$q->q_title - 匹配条件里写的
$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
相关产品推荐
相关产品推荐

