web-dev-qa-db-fra.com

Laravel Eloquent ouWhere Query

Quelqu'un peut-il me montrer comment écrire cette requête dans Eloquent?

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

Je suis en train de penser

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

De plus, mes variables (17 et 19) dans ce cas proviennent d'une zone de sélection multiple, donc fondamentalement d'un tableau. Des indices sur la façon de parcourir cela et d’ajouter dynamiquement ces clauses where/orWhere?

Merci.

8
sarovarc

Vous pouvez le faire de trois manières. Supposons que vous ayez un tableau sous la forme 

['myselect' => [11, 15, 17, 19], 'otherfield' => 'test', '_token' => 'jahduwlsbw91ihp'] qui pourrait être un dump de \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();
    
17
Damien Pirsy

La meilleure approche pour ce cas utilise l’équivalent de Laravel pour la fonction IN() de SQL.

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

Sera le même que:

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

Cette approche est plus agréable et plus efficace - selon le Mysql Manual , si toutes les valeurs sont des constantes, IN trie la liste puis utilise une recherche binaire.

9
HtmHell

Dans laravel 5, vous pouvez le faire de cette façon.

$projects = Projects::query();

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

$result = $projects->get();    

Ceci est très utile spécialement si vous avez des méthodes personnalisées sur votre modèle Projects et que vous devez interroger à partir de variable. Vous ne pouvez pas transmettre $selects dans la méthode orWhere.

3
kdlcruz