2017-09-05 144 views
0

eloquent查询过滤器:Laravel雄辩查询建筑物或

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'); 
     }); 

构建成这样的SQL:

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

如何改变eloquent代码来构建这个查询(在OR左右括号):

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

的可能的复制[Laravel雄辩ORM - 复杂哪里查询(https://stackoverflow.com/questions/29036959/laravel-雄辩-ORM复杂,其中查询) –

回答

2

你可以请这样做:

->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

我没有一个实例的雄辩手来测试,但现在它会是这样的东西?

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'); 
     }) 
    }) 
; 

也就是说,你把组合在一起成为地方上的匿名功能的条件?

0

请尝试移动orWhere条件到这样的第一个匿名函数,

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'); 
     }); 
     })