Laravel Eloquent Builder绑定字符串丢失前导零问题求助
问题
我需要查询所有包含带前导零子串(示例:'02549')的结果。直接使用以下代码能生成正确SQL:
$code = '02549'; Nomenclature::where('code', 'like', '%' . $code . '%')->get();
对应的SQL为:
select * from `nomenclatures` where `code` like '%02549%'
但使用when条件构建器时:
Nomenclature::when(true, function($query, $code) { $query->where('code', 'like', '%' . $code . '%'); })->get();
生成的SQL丢失了前导零,变为:
select * from `nomenclatures` where `code` like '%1%'
请问这是什么原因?
原因分析与解决办法
核心原因
when方法的闭包参数接收的第二个值不是你外部定义的$code变量,而是when第一个参数传入的true。PHP会把布尔值true自动转换为整数1,拼接后就变成了%1%,直接丢失了原有的前导零。
解决办法
要让闭包能访问外部的$code变量,必须用use关键字把变量导入闭包作用域:
$code = '02549'; Nomenclature::when(true, function($query) use ($code) { $query->where('code', 'like', '%' . $code . '%'); })->get();
修改后闭包就能正确获取到'02549'的值,生成的SQL也会恢复正确的匹配规则。
内容的提问来源于stack exchange,提问作者Sanya H
相关产品推荐
相关产品推荐

