2014-12-24 8 views
5

Может кто-нибудь покажет мне, как написать этот запрос в Eloquent?Laravel Eloquent orWhere Query

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

Я имею в виду

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

Также мои переменные (17 и 19) в этом случае приходят из нескольких выберите поле, так что в основном в массиве. Любые подсказки о том, как циклически перебирать их и добавлять их где/или Where клаузует динамически?

Спасибо.

ответ

13

Вы могли бы сделать это тремя способами. Предположим, у Вас есть массив в виде

['myselect' => [11, 15, 17, 19], 'otherfield' => 'test', '_token' => 'jahduwlsbw91ihp'], который может быть свалка \Input::all();

  1. Project::where(function ($query) { 
         foreach(\Input::get('myselect') as $select) { 
         $query->orWhere('id', '=', $select); 
         } 
        })->get(); 
    
  2. Project::whereIn('id', \Input::get('myselect'))->get(); 
    
  3. $sql = \DB::table('projects'); 
        foreach (\Input::get('myselect') as $select) { 
         $sql->orWhere('id', '=', $select); 
        } 
        $result = $sql->get(); 
    
1

В Laravel 5 вы могли бы это сделать это путь.

$projects = Projects::query(); 

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

$result = $projects->get();  

Это очень полезно, особенно если у вас есть пользовательские методы в вашей модели проектов, и вам нужно запросить переменную. Вы не можете пройти $selects внутри метода orWhere.

9

Лучшим подходом для этого случая является использование эквивалента Laravel для SQL-кода IN().

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

Будет так же, как:

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

Этот подход является более хорошим, а также более эффективно - в соответствии с Mysql Manual, если все значения константы, IN сортирует список, а затем использует бинарный поиск ,