Laravel Eloquent比较两列不生效,whereRaw却正常,求原因
问题原因及解决方法
核心问题:普通
where方法的第三个参数会被当作字面量值解析,而非数据库字段名
你写的where('qty_reserve','!=','qty_in_pick_up'),实际生成的SQL是:SELECT * FROM customer_order_lines WHERE qty_reserve != 'qty_in_pick_up'数据库会把字符串
'qty_in_pick_up'转换为数字0,你的qty_reserve值是4,4≠0,所以这条数据被错误筛选出来。为什么
whereRaw能正常工作?whereRaw会直接把传入的字符串作为SQL片段拼接,生成的SQL是:SELECT * FROM customer_order_lines WHERE qty_in_pick_up != qty_reserve这才是正确的字段与字段之间的比较逻辑。
更规范的替代写法:使用
whereColumn
Laravel提供了专门用于字段间比较的whereColumn方法,比whereRaw更安全(规避SQL注入风险),写法如下:$lines = CustomerOrderLine::whereColumn('qty_reserve', '!=', 'qty_in_pick_up')->get();
内容的提问来源于stack exchange,提问作者MathieuB
相关产品推荐
相关产品推荐

