CodeIgniter 4中如何将生成查询列的条件加入WHERE参数?
问题解决:CodeIgniter 4中无法在WHERE子句使用SELECT生成的列别名
问题原因
SQL的执行顺序中,WHERE子句的执行优先级早于SELECT子句。你在SELECT里定义的fee_status别名,在WHERE阶段还未被创建,因此数据库会提示找不到该列。
解决方案
方案一:直接在WHERE中使用生成列的逻辑表达式
将fee_status的判断逻辑直接写入WHERE条件,绕过别名的使用,这是性能最优的方式:
public function check_header($id){ return $this->db->table('header a') ->select('*, IF(NOW() BETWEEN a.fee_date_active AND a.fee_date_exp, "applied", "exp") AS fee_status') ->where('a.id', $id) ->where('NOW() BETWEEN a.fee_date_active AND a.fee_date_exp') ->orderBy('a.id', 'DESC') ->get()->getResult(); }
方案二:使用HAVING子句替代WHERE(适合复用别名的场景)
HAVING子句在SELECT之后执行,可以识别SELECT中定义的别名,写法更简洁:
public function check_header($id){ return $this->db->table('header a') ->select('*, IF(NOW() BETWEEN a.fee_date_active AND a.fee_date_exp, "applied", "exp") AS fee_status') ->where('a.id', $id) ->having('fee_status', 'applied') ->orderBy('a.id', 'DESC') ->get()->getResult(); }
注意:无分组场景下使用HAVING,性能略逊于方案一,适合小数据量或需要多次复用别名的场景。
内容的提问来源于stack exchange,提问作者Bonifacius Sarumpaet
相关产品推荐
相关产品推荐

