在 Laravel 上有另一个 Where 过滤器

Having another Where Filter on Laravel

我正在尝试进行搜索,并且只想 return 状态为 1,4 的用户。虽然当我尝试使用它时,它会抓住所有这些并忽略我最后的位置。

$officiants = Officiant::where('status',1)
                        ->where('email', 'like',  '%'.$item.'%')
                        ->orWhere('lname', 'like', '%'.$item.'%')
                        ->orWhere('lname', 'like', '%'.$item.'%')
                        ->whereIn('status', [1,4])
                        ->get();

我也试过了

$officiants = Officiant::where('status',1)
                        ->where('email', 'like',  '%'.$item.'%')
                        ->orWhere('lname', 'like', '%'.$item.'%')
                        ->orWhere('lname', 'like', '%'.$item.'%')
                        ->where('status', 1)
                        ->where('status', 4)
                        ->get();

问题是您需要了解 where chaining 和 orWhere chaining 在 Laravel 中的工作原理。

当您说 $query->where(..a..)->orWhere(..b..)->where(..c..)->orWhere(..d..) 时,它将计算为:(a || (b && c) || d)。您可能打算 ((a || b) && (c || d)) 或者您可能打算 ((a && c) || b || d)。这就是为什么当您需要高级 where 子句时,请使用 parameter grouping

你需要这样的东西:

$officiants = Officiant::where('status',1)
    ->where(function($query) use($item){
        $query->where('email', 'like',  '%'.$item.'%')
            ->orWhere('lname', 'like', '%'.$item.'%')
            ->orWhere('lname', 'like', '%'.$item.'%')
    })
        ->whereIn('status', [1,4])
        ->get();

注意:这没有经过测试

我刚弄明白

   $officiants = Officiant::where('status', 1)
                                    ->orWhere('status', 4)
                                    ->where(function ($query) use ($item) {
                                      $query->where('email', 'like',  '%'.$item.'%')
                                            ->where('lname', 'like', '%'.$item.'%')
                                            ->where('lname', 'like', '%'.$item.'%');
                                    })->get();