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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:25:56