Laravel Eloquent中如何正确添加带自定义SQL函数的查询条件?
Eloquent追加自定义函数查询条件的正确写法
不生效的常见原因
直接调用whereRaw没生效,基本是踩了这两个坑:
- 传入的原生SQL片段手动带了开头的
AND:Laravel查询构造器会自动给所有链式调用的where条件拼接对应的逻辑连接符,手动写AND会导致最终SQL出现重复的AND AND语法错误,条件自然无法正常执行 - 硬编码的参数值类型不匹配:直接把字符串值写在SQL片段里,容易出现字符集、类型隐式转换导致的匹配失效,还存在SQL注入风险
可直接运行的实现代码
在->get()前链式调用whereRaw即可,注意不要手动写片段开头的AND,IN列表的参数优先用占位符绑定传入:
MODEL::where(/* 你的第一个where条件 */) ->whereRaw(/* 你之前写的原生where条件 */) // 自定义函数条件通过占位符绑定参数,无需手动加AND前缀 ->whereRaw('functionX(Id, 1) IN (?, ?, ?)', ['1', '2', '3']) ->get();
如果你需要验证最终生成的SQL是否符合预期,可以临时把->get()替换成->toSql()打印完整SQL语句,直接到数据库客户端执行排查,重点确认这几点:
- 自定义函数
functionX在当前使用的数据库账号下有执行权限 - 字段名
Id的大小写、拼写和实际表结构一致 - 函数返回值类型和IN列表里的值类型可以正常匹配
不推荐直接把IN值硬编码在SQL片段中传入,如果确实要写死值,记得把片段开头的
AND删掉,传入内容为functionX(Id, 1) IN ('1','2','3')即可,不要带前缀AND。
内容的提问来源于stack exchange,提问作者user19255665
相关产品推荐
相关产品推荐

