2016-08-15 87 views
2

我想有这种查询雄辩:如何结合WHERE子句中雄辩

SELECT * FROM table WHERE status = 1 AND (type = 2 OR type = 3 OR type = 4) 

我一直没能找到雄辩这样做的一个简单的方法。如果我使用

Table::where('status', 1)->orWhere('type', 2)->orWhere('type', 3)... 

这这相当于:

SELECT * FROM table WHERE status = 1 OR type = 2 OR type = 3 OR type = 4 

这不是我所需要的。为'status = 1'创建一个查询范围也会得到相同的结果。我如何在Eloquent中运行这个查询?

回答

3

为了群里这样的条款,你需要一个封闭传递给where()方法,并添加里面的分组情况关闭。所以,你的代码看起来是这样的:

Table::where('status', 1)->where(function ($q) { 
    return $q->where('type', 2)->orWhere('type', 3)->orWhere('type', 4); 
}); 

这将生成SQL:

SELECT * FROM tables WHERE status = 1 AND (type = 2 OR type = 3 OR type = 4) 
1

,你可以尝试在whereparameter grouping达到你想要的东西。

Table::where('status', 1)->where(function ($query) { 
      $query->where('type', 2) 
        ->orWhere('type', 3) 
        ->orWhere('type',4);}) 

欲了解更多信息,请查阅laravel Query builder文件。

-1

试试这个:

Table::where(function($query){ 
     $query->where('status', 1) 
      ->orWhere('type', 2) 
      ->orWhere('type', 3); 
}); 
1

雄辩允许nested parameter groupings传递闭包作为的where的说法,orWhere,或无证,但更多的表现whereNested

Table::where('status', 1) 
    ->whereNested(function ($query) { 
     $query->where('type', 2) 
       ->orWhere('type', 3) 
       ->orWhere('type', 4); 
    });