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

将含子查询、隐式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();

关键细节说明

  1. 子查询处理:在select()方法里直接写入子查询,设置第二个参数为FALSE是为了避免框架自动转义子查询的语法,保证逻辑正常执行。
  2. 关联表优化:把原SQL的隐式连接换成显式的join()方法,不仅可读性更好,也是Query Builder推荐的标准写法。
  3. 安全防护:$user_id和$subcat_id这类变量直接作为where()的参数传入,框架会自动做转义处理;FIND_IN_SET部分用绑定参数?,同样是为了规避SQL注入风险。
  4. 排序逻辑:用框架提供的order_by()(CI3)或orderBy()(CI4)方法直接指定排序规则,和原生SQL逻辑完全对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:52:17