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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:48:04