如何在Laravel Eloquent查询中将嵌套关联字段转为小写?
解决嵌套关联查询中字段转小写的问题
你当前的嵌套关联查询代码如下:
$query->whereHas("client.partner", function ($query) use ($searchterm, $relation) { $query->when($relation === "contains", function ($query) use ($searchterm, $relation) { $query->where("partners.name", "LIKE", "%" . strtolower($searchterm) . "%"); }); });
想要将partners.name字段转为小写再匹配,但直接写LOWER("partners.name")不生效——问题出在PHP会把LOWER()当成PHP函数(PHP本身没有这个内置函数),最终生成的SQL不是执行数据库的LOWER函数,而是把LOWER(partners.name)当作字段名来处理,自然达不到预期效果。
给你三种可行的解决办法:
- 使用
DB::raw()包裹SQL函数
$query->where(DB::raw('LOWER(partners.name)'), 'LIKE', '%' . strtolower($searchterm) . '%');
DB::raw()会告诉Laravel直接把里面的内容作为原生SQL片段解析,让数据库正确执行LOWER函数。
- 使用
whereRaw()方法直接写原生条件
$query->whereRaw('LOWER(partners.name) LIKE ?', ['%' . strtolower($searchterm) . '%']);
这种方式更直观,把完整的条件语句写在第一个参数,第二个参数用占位符绑定搜索值,还能避免SQL注入风险。
- Laravel 8+ 可用
whereLower()快捷方法
如果你的项目用的是Laravel 8及以上版本,可以直接用框架提供的快捷方法:
$query->whereLower('partners.name', 'LIKE', '%' . strtolower($searchterm) . '%');
这个方法内部已经封装了字段转小写的逻辑,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Tamás László
相关产品推荐
相关产品推荐

