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

CodeIgniter中Case-When条件使用方法及SQL转换求助

在CodeIgniter中使用CASE WHEN条件并转换你的SQL查询

没问题,我来帮你把这段原生SQL转换成CodeIgniter的查询构造器写法,这样更贴合框架规范,也更便于后续维护~

首先,先拆解你原生SQL里的核心逻辑:获取工单表的所有字段,关联部门表取部门名称,关联用户表取客服名称,再通过CASE WHEN判断如果访客名称不为空就用访客名,否则用关联的用户名作为最终客户名。

CodeIgniter 3 写法(适配你的代码风格)

假设你是在模型里编写这段逻辑,代码如下:

$search = "%$search%";

// 选择需要的字段,重点处理CASE WHEN部分
$this->db->select('tickerr_tickets.*');
$this->db->select('tickerr_users2.name as agent_name');
$this->db->select('tickerr_ticket_departments.name as department_name');
// 这里第二个参数传false,是告诉框架不要自动转义表达式里的字段,避免语法错误
$this->db->select("CASE WHEN guest_name != '' THEN guest_name ELSE tickerr_users1.name END AS client_final_name", false);

// 关联表:内联部门表,左联用户表(客户和客服)
$this->db->join('tickerr_ticket_departments', 'tickerr_tickets.department = tickerr_ticket_departments.id', 'inner');
// 补全你截断的左联客户用户表条件,可根据实际字段调整
$this->db->join('tickerr_users tickerr_users1', 'tickerr_tickets.client_id = tickerr_users1.id', 'left');
// 左联客服用户表,根据实际字段调整关联条件
$this->db->join('tickerr_users tickerr_users2', 'tickerr_tickets.agent_id = tickerr_users2.id', 'left');

// 添加搜索条件(如果需要搜索客户名或其他字段)
$this->db->like('client_final_name', $search);
// 如果是多字段模糊搜索,可分组处理避免逻辑混乱
// $this->db->group_start();
// $this->db->like('tickerr_tickets.subject', $search);
// $this->db->or_like('client_final_name', $search);
// $this->db->group_end();

// 执行查询并获取结果
$query = $this->db->get('tickerr_tickets');
$result = $query->result();

关键说明

  • CASE WHEN 处理:因为CASE WHEN是SQL表达式,直接用select()传入时要加上false参数,防止CodeIgniter自动给字段添加反引号导致语法错误。
  • 关联表:使用join()方法,第三个参数指定关联类型(inner/left),关联条件清晰明了。
  • 搜索条件:通过like()/or_like()添加模糊搜索,多条件时用group_start()和group_end()分组,保证逻辑正确。

如果你用的是CodeIgniter 4

写法略有不同,改用table()方法,示例如下:

$search = "%$search%";

$db = \Config\Database::connect();

$query = $db->table('tickerr_tickets')
            ->select('tickerr_tickets.*')
            ->select('tickerr_users2.name as agent_name')
            ->select('tickerr_ticket_departments.name as department_name')
            ->select("CASE WHEN guest_name != '' THEN guest_name ELSE tickerr_users1.name END AS client_final_name", false)
            ->join('tickerr_ticket_departments', 'tickerr_tickets.department = tickerr_ticket_departments.id', 'inner')
            ->join('tickerr_users tickerr_users1', 'tickerr_tickets.client_id = tickerr_users1.id', 'left')
            ->join('tickerr_users tickerr_users2', 'tickerr_tickets.agent_id = tickerr_users2.id', 'left')
            ->like('client_final_name', $search)
            ->get();

$result = $query->getResult();

这样转换后,既保留了你原生SQL的所有业务逻辑,又符合CodeIgniter的最佳实践,后续修改条件也更方便~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:15:44