Laravel Eloquent二次过滤查询结果时出现报错求助
解决Laravel Eloquent二次查询的报错问题
看起来你遇到的问题主要来自两个地方:查询方法名的大小写错误,以及错误地在查询构建器实例上提前调用了get()导致后续无法使用查询方法。我来帮你一步步解决:
首先,修正方法名的大小写问题
Laravel Eloquent查询构建器的方法是驼峰命名的,你代码里的orwhere和orwhereIn是错误写法,正确的应该是orWhere和orWhereIn。小写的方法名在查询构建器中不存在,这是报错的直接原因之一。
其次,避免提前调用get()
如果你的$poolResults一开始是未执行的查询构建器实例(还没调用过get()),那么不要在过滤逻辑里直接调用get()——因为调用get()后,$poolResults会变成Illuminate\Database\Eloquent\Collection实例,而Collection没有查询构建器的where/orWhere方法,后续操作自然会报错。
正确的做法(QueryBuilder实例场景)
把get()移到所有过滤逻辑之后,统一执行查询:
// 假设$poolResults最初是QueryBuilder实例,比如: // $poolResults = User::query(); // 或者其他模型的查询 if($locationOfUser != ''){ // 用闭包分组条件,避免和其他已有where条件冲突 $poolResults = $poolResults->where(function($query) use ($locationOfUser, $zipCodes) { $query->where('city', $locationOfUser) ->orWhere('users.city_search', $locationOfUser) ->orWhereIn('users.zip', $zipCodes); }); } // 最后统一获取结果 $poolResults = $poolResults->get();
这里用闭包包裹三个条件很关键:如果你的$poolResults之前还有其他where条件,直接用orWhere会打乱整个查询逻辑,闭包能保证这三个条件是一组“或”的关系,和其他条件保持“与”的逻辑。
如果$poolResults已经是Collection实例
如果你的$poolResults已经是调用过get()后的集合,那就要用Collection的filter()方法来过滤:
if($locationOfUser != ''){ $poolResults = $poolResults->filter(function($item) use ($locationOfUser, $zipCodes) { return $item->city === $locationOfUser || $item->city_search === $locationOfUser || in_array($item->zip, $zipCodes); }); }
这样就能基于已有的集合结果完成二次过滤了。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

