将含子查询、隐式JOIN及FIND_IN_SET()的SQL转为CodeIgniter Active Record
把原生SQL转换为CodeIgniter Query Builder写法
没问题,我来帮你把这段原生SQL转换成CodeIgniter Query Builder的写法,这样既符合框架规范,还能自动帮你防范SQL注入风险(尤其是处理变量的时候)。
先梳理下你的原生SQL逻辑:通过子查询获取每个商品的首张图片,关联商品表和分类表,过滤掉当前用户的商品、状态正常且未被交换/取消的商品,还要匹配用户感兴趣的分类,最后按展示量降序排序。
下面是对应的Query Builder实现(我会分别给出CodeIgniter 3和4的写法):
CodeIgniter 3 写法
// 初始化查询构建器,指定商品表并设置别名 $this->db->from('bc_item i'); // 关联分类表,替代原SQL的隐式连接,可读性更强 $this->db->join('bc_category c', 'i.cat_id = c.id', 'inner'); // 选择需要的字段,包含子查询获取首张商品图片 $this->db->select(" (SELECT image FROM bc_item_image WHERE item_id = i.id LIMIT 1) as item_image, i.description, i.condition, c.cat_name as category_name, i.id as ID ", FALSE); // 第二个参数FALSE表示不自动转义字段(子查询需要保留原样) // 添加WHERE过滤条件 $this->db->where('i.user_id !=', $user_id); $this->db->where('i.status', '1'); $this->db->where('i.is_bartered', '0'); $this->db->where('i.is_cancel', '0'); // 处理FIND_IN_SET条件,用绑定参数更安全 $this->db->where("FIND_IN_SET(?, i.interested_cat)", $subcat_id); // 设置排序规则 $this->db->order_by('i.display_count', 'desc'); // 执行查询并获取结果集 $query = $this->db->get(); $result = $query->result();
CodeIgniter 4 写法
如果是用CI4,写法会稍有不同,主要通过$db->table()来操作:
$db = \Config\Database::connect(); $query = $db->table('bc_item i') ->select(" (SELECT image FROM bc_item_image WHERE item_id = i.id LIMIT 1) as item_image, i.description, i.condition, c.cat_name as category_name, i.id as ID ", false) ->join('bc_category c', 'i.cat_id = c.id') ->where('i.user_id !=', $user_id) ->where('i.status', '1') ->where('i.is_bartered', '0') ->where('i.is_cancel', '0') ->where("FIND_IN_SET(?, i.interested_cat)", $subcat_id) ->orderBy('i.display_count', 'desc') ->get(); $result = $query->getResult();
关键细节说明
- 子查询处理:在
select()方法里直接写入子查询,设置第二个参数为FALSE是为了避免框架自动转义子查询的语法,保证逻辑正常执行。 - 关联表优化:把原SQL的隐式连接换成显式的
join()方法,不仅可读性更好,也是Query Builder推荐的标准写法。 - 安全防护:
$user_id和$subcat_id这类变量直接作为where()的参数传入,框架会自动做转义处理;FIND_IN_SET部分用绑定参数?,同样是为了规避SQL注入风险。 - 排序逻辑:用框架提供的
order_by()(CI3)或orderBy()(CI4)方法直接指定排序规则,和原生SQL逻辑完全对应。
内容的提问来源于stack exchange,提问作者Bhavya Sanchaniya
相关产品推荐
相关产品推荐

