CodeIgniter构造SQL查询报where子句slug列不存在错误如何解决
问题根源
SQL的执行顺序为:FROM/JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT。你在SELECT阶段定义的别名slug,在WHERE执行的时候还没有生成,所以直接在WHERE子句中引用slug就会触发字段不存在的报错。
修复方案
方案1:改用HAVING判断(改动最小)
HAVING子句在SELECT执行后运行,可以识别SELECT中定义的别名,仅需要修改get_category_by_slug方法即可:
//get category by slug public function get_category_by_slug($slug) { $this->build_query($this->selected_lang->id, true); // 把判断slug的条件从where改为having $this->db->having('slug', clean_str($slug))->limit(1); $this->db->where('visibility', 1); $query = $this->db->get('categories'); return $query->row(); }
方案2:WHERE中直接使用子查询(性能更优)
不在WHERE中使用别名,直接复用计算slug的子查询作为判断条件,适合数据量偏大的场景:
//get category by slug public function get_category_by_slug($slug) { $lang_id = clean_number($this->selected_lang->id); $this->build_query($lang_id, true); // 直接在where中写入slug的计算逻辑 $this->db->where("(SELECT slug FROM categories_lang WHERE categories_lang.category_id = categories.id AND categories_lang.lang_id = {$lang_id} LIMIT 1) = ", clean_str($slug))->limit(1); $this->db->where('visibility', 1); $query = $this->db->get('categories'); return $query->row(); }
方案3:改用JOIN关联多语言表(更规范,推荐)
抛弃子查询查多语言字段的写法,改用JOIN关联categories_lang表,逻辑更清晰、性能更可控:
//get category by slug public function get_category_by_slug($slug) { $lang_id = clean_number($this->selected_lang->id); $this->build_query($lang_id, true); // 关联对应语言的多语言表 $this->db->join('categories_lang', 'categories_lang.category_id = categories.id AND categories_lang.lang_id = ' . $lang_id); // 直接用多语言表的slug字段判断 $this->db->where('categories_lang.slug', clean_str($slug))->limit(1); $this->db->where('visibility', 1); $query = $this->db->get('categories'); return $query->row(); }
内容的提问来源于stack exchange,提问作者aude
相关产品推荐
相关产品推荐

