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
相关产品推荐
相关产品推荐

