You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)当作字段名来处理,自然达不到预期效果。

给你三种可行的解决办法:

  1. 使用DB::raw()包裹SQL函数
$query->where(DB::raw('LOWER(partners.name)'), 'LIKE', '%' . strtolower($searchterm) . '%');

DB::raw()会告诉Laravel直接把里面的内容作为原生SQL片段解析,让数据库正确执行LOWER函数。

  1. 使用whereRaw()方法直接写原生条件
$query->whereRaw('LOWER(partners.name) LIKE ?', ['%' . strtolower($searchterm) . '%']);

这种方式更直观,把完整的条件语句写在第一个参数,第二个参数用占位符绑定搜索值,还能避免SQL注入风险。

  1. Laravel 8+ 可用whereLower()快捷方法
    如果你的项目用的是Laravel 8及以上版本,可以直接用框架提供的快捷方法:
$query->whereLower('partners.name', 'LIKE', '%' . strtolower($searchterm) . '%');

这个方法内部已经封装了字段转小写的逻辑,代码更简洁易读。

内容的提问来源于stack exchange,提问作者Tamás László

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:37:39