Laravel Eloquent orWhere查询

12

有人可以向我展示如何使用Eloquent编写此查询吗?

SELECT * FROM `projects` WHERE `id`='17' OR `id`='19'

我在思考

Project::where('id','=','17')
        ->orWhere('id','=','19')
        ->get();

在这种情况下,我的变量(17和19)是来自多选框,因此基本上是一个数组。有什么线索可以动态循环遍历并添加这些where/orWhere子句的吗?

谢谢。

4个回答

23
你可以用三种方法来处理。假设你有一个形如 ['myselect' => [11, 15, 17, 19], 'otherfield' => 'test', '_token' => 'jahduwlsbw91ihp'] 的数组,它可能是 \Input::all(); 的输出。
       Project::where(function ($query) {
          foreach(\Input::get('myselect') as $select) {
             $query->orWhere('id', '=', $select);
          }
       })->get();
    
  1.    Project::whereIn('id', \Input::get('myselect'))->get();
    
  2.    $sql = \DB::table('projects');
       foreach (\Input::get('myselect') as $select) {
           $sql->orWhere('id', '=', $select);
       }
       $result = $sql->get();
    

如果在循环之前已经有一个where语句,3会发生什么情况? - Miguel Stevens

17

对于这种情况,最好的方法是使用Laravel中等价于SQL的IN()

Project::whereIn('id', [17, 19])->get();

将与原来相同:

SELECT * FROM projects WHERE id IN (17, 19)

根据MySQL手册,此方法更加高效且更加美观。如果所有值都是常量,IN会对列表进行排序,然后使用二分查找。


4
在Laravel 5中,您可以这样做。
$projects = Projects::query();

foreach ($selects as $select) {
    $projects->orWhere('id', '=', $select);
}

$result = $projects->get();    

如果你的 Projects 模型有自定义方法并且需要从变量进行查询,那么这将非常有用。你无法在 orWhere 方法中传递 $selects


1
如果在循环之前已经有where语句,会发生什么?由于循环已经以OR开头,那么where语句不会失效吗? - Miguel Stevens
据我所知,是的,它将被作废。 - Ali Gajani

1
public function getSearchProducts($searchInput)
    {
        $products = Cache::rememberForever('getSearchProductsWithDiscountCalculationproducts',  function () {
            return DB::table('products_view')->get();
        });

        $searchProducts = $products->filter(function ($item) use($searchInput)  {
            return preg_match('/'.$searchInput.'/i', $item->productName) || preg_match('/'.$searchInput.'/i', $item->searchTags) ;
        });

         $response = ["status" => "Success", "data" => $searchProducts ];
        return response(json_encode($response), 200, ["Content-Type" => "application/json"]);
    }

使用筛选功能来适应任何定制情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接