Laravel 5.5关联模型查询异常:服务与用户模型搜索返回空集合
问题分析与解决方案
嘿,我一眼就看出问题所在啦!你当前的查询语句用了where + whereHas的组合,这会让数据库执行AND逻辑——也就是要求service_name匹配关键词的同时,关联的用户name也必须匹配关键词,这显然和你想要的「在Service或关联User中搜索」的需求不符,这就是返回空集合的原因~
正确的查询写法
你需要把第二个whereHas替换成orWhereHas,这样就能实现OR逻辑,满足「service_name匹配 或者 关联用户name匹配」的搜索需求:
$items = Service::where('service_name', 'LIKE', "%{$query}%") ->orWhereHas('user', function($q) use ($query){ $q->where('name', 'LIKE', "%{$query}%"); })->get();
额外优化建议
如果你的数据库对大小写敏感(比如MySQL使用了区分大小写的排序规则),可以通过统一转换为小写来实现大小写不敏感的搜索,避免因为大小写差异漏查结果:
use Illuminate\Support\Facades\DB; $lowerQuery = strtolower($query); $items = Service::whereRaw('LOWER(service_name) LIKE ?', ["%{$lowerQuery}%"]) ->orWhereHas('user', function($q) use ($lowerQuery){ $q->whereRaw('LOWER(name) LIKE ?', ["%{$lowerQuery}%"]); })->get();
这样处理后,不管用户输入的是大写还是小写关键词,都能匹配到对应的结果。
内容的提问来源于stack exchange,提问作者Flexi
相关产品推荐
相关产品推荐

