在Laravel中使用LIKE查询数据库表时无返回结果如何解决
问题原因
- 代码中直接调用
Auth::user()->friends(关联属性不带括号)时,获取的是已经执行完SQL查询返回的Eloquent集合(Collection),并非数据库查询构造器实例。 - Laravel 集合的
where方法仅支持简单的等于匹配逻辑,无法识别LIKE这类SQL操作符,因此添加LIKE条件后无法匹配到符合要求的结果,无返回内容。
解决办法
方案1:使用查询构造器完成SQL层面的模糊查询(推荐,性能更优)
在关联名后加括号返回查询构造器实例,直接在数据库层面执行LIKE匹配,效率更高,适合数据量较大的场景:
Auth::user() ->friends() // 加括号返回查询构造器,触发SQL查询 ->where('friend.first_name', 'LIKE', '%' . $firstName . '%') ->get(); // 查询构造器使用get方法获取结果,不要用集合的all方法
方案2:在已有集合上做模糊匹配
如果已经提前获取了全量好友集合,也可以用集合的filter方法自定义匹配逻辑实现模糊查询:
$matchedFriends = Auth::user() ->friends ->filter(function ($friend) use ($firstName) { // PHP8及以上可直接用str_contains,低版本可以用strpos !== false代替 return str_contains($friend->first_name, $firstName); }) ->all();
补充注意点
如果数据库first_name字段的排序规则是大小写敏感的,可调整条件忽略大小写匹配,避免遗漏结果:
// SQL层面忽略大小写示例 Auth::user() ->friends() ->whereRaw('LOWER(friend.first_name) LIKE ?', ['%' . strtolower($firstName) . '%']) ->get();
内容的提问来源于stack exchange,提问作者CoderTn
相关产品推荐
相关产品推荐

