2017-09-05 5 views
0

Diese eloquent Abfragefilter:Laravel eloquent die Erstellung von Abfragen mit OR

return $this->games() 
     ->where(function ($query) { 
      $query->where('active_player_id', '=', $this->id) 
       ->where('stage_name', '<>', 'setup'); 
     }) 
     ->orWhere(function ($query) { 
      $query->where('active_player_id', '<>', $this->id) 
       ->where('stage_name', '=', 'setup'); 
     }); 

Baut in SQL wie folgt aus:

where `games_players`.`player_id` = '1' 
and (`active_player_id` = '1' and `stage_name` <> 'setup') 
or (`active_player_id` <> '1' and `stage_name` = 'setup') 

Wie kann ich die diese Abfrage (Klammern eloquent Code ändern um die OR zu bauen):

where `games_players`.`player_id` = '1' 
and (
    (`active_player_id` = '1' and `stage_name` <> 'setup') 
    or (`active_player_id` <> '1' and `stage_name` = 'setup') 
    ) 
+0

Mögliche Duplikat [Laravel Eloquent ORM - Komplexe, wo Abfragen] (https://stackoverflow.com/questions/29036959/laravel- eloquent-orm-complex-where-Abfragen) –

Antwort

2

Sie können a chieve, dass dadurch:

->where('active_player_id',1) 
    ->where(function($q){ 
      $q->where([ ['active_player_id', 1],['stage_name','!=', 'setup'] ]) 
      ->orWhere([ ['active_player_id','!=', 1],['stage_name', 'setup'] ] 
    })->get() 
0

Ich habe keine Instanz von Eloquent zur Hand gerade jetzt testen gegen aber wäre es jetzt so etwas wie diese?

return $this->games() 
    ->where(function ($query) { 
     $query->where(function ($query) { 
      $query->where('active_player_id', '=', $this->id) 
       ->where('stage_name', '<>', 'setup'); 
     }) 
     ->orWhere(function ($query) { 
      $query->where('active_player_id', '<>', $this->id) 
       ->where('stage_name', '=', 'setup'); 
     }) 
    }) 
; 

Das heißt, Sie legen die Bedingungen in einer anonymen Funktion auf wo gruppiert werden?

0

Versuchen Sie orWhere Zustand in die erste anonyme Funktion wie diese bewegen,

return $this->games() 
     ->where(function ($query) { 
      $query->where('active_player_id', '=', $this->id) 
       ->where('stage_name', '<>', 'setup') 
      ->orWhere(function ($query) { 
       $query->where('active_player_id', '<>', $this->id) 
        ->where('stage_name', '=', 'setup'); 
     }); 
     })