如何将原生SQL查询改写为CodeIgniter查询构造器调用格式
错误原因
- 重复调用
$this->db->select('*')、$this->db->from('airwaybill'),会让查询构造器把airwaybill也加入主查询的FROM子句,导致表名冲突报错 - NOT EXISTS是子查询逻辑,需要完整写在WHERE条件中,不需要单独调用from指定表
- 遗漏了原SQL的ORDER BY排序逻辑
- 最后调用
get()方法时重复传入表名rincian_permintaan,而你之前已经通过from()指定过主表,重复传入会导致主表被重复定义报错
正确改写代码
直接把NOT EXISTS子查询作为自定义WHERE条件传入,第三个参数设为FALSE关闭自动转义即可和原SQL逻辑完全一致:
$this->db->select('*'); $this->db->from('rincian_permintaan'); $this->db->join('permintaan', 'permintaan.id_permintaan = rincian_permintaan.id_permintaan'); $this->db->join('users', 'permintaan.id_peminta = users.user_id'); $this->db->join('cabang', 'cabang.id_cabang = users.id_cabang'); $this->db->join('barang', 'barang.id_barang = rincian_permintaan.id_barang'); $this->db->join('po', 'rincian_permintaan.id_po = po.id_po'); $this->db->where('po.id_cabang', '201'); $this->db->where('users.id_cabang !=', 201); // 写入NOT EXISTS子查询,关闭自动转义 $this->db->where('NOT EXISTS (SELECT * FROM airwaybill WHERE airwaybill.id_rincian_permintaan = rincian_permintaan.id_rincian_permintaan)', NULL, FALSE); // 补充排序逻辑 $this->db->order_by('rincian_permintaan.created_at', 'DESC'); // get方法无需再传表名 return $this->db->get()->result_array();
内容的提问来源于stack exchange,提问作者Setiawan
相关产品推荐
相关产品推荐

