Laravel查询关联pivot表的角色下用户时where条件无结果如何解决
问题原因
- 你通过
$rolesobj->users属性访问关联数据时,Laravel会先执行SQL查询该角色对应的全部用户,返回的是Illuminate\Database\Eloquent\Collection集合对象,而非SQL查询构造器。 - Laravel集合的
where()方法仅支持全等匹配,不识别like模糊查询语法,你写的匹配条件没有生效,因此无法返回符合预期的结果。
解决方法
推荐使用关联查询构造器的方式,直接在数据库层面做条件筛选,性能更高:
$rolesobj = Role::find($type_id); // 增加判空逻辑避免角色不存在时报错 if (empty($rolesobj)) { $resultset = collect(); } elseif (self::checksearchtype($searchquery) == NAME_ONEPART) { // 调用users()方法返回查询构造器,拼接like条件后再执行查询 $resultset = $rolesobj->users() ->where('firstname', 'like', "%{$searchquery}%") ->get(); }
如果你确实需要在已经加载的用户集合中做筛选,使用filter()方法自定义模糊匹配逻辑:
$resultset = $rolesobj->users->filter(function ($user) use ($searchquery) { // 不区分大小写的话可以转成小写再匹配 return stripos($user->firstname, $searchquery) !== false; });
内容的提问来源于stack exchange,提问作者logeeks
相关产品推荐
相关产品推荐

