【问题标题】:Laravel eloquent query building using ORLaravel 雄辩的查询构建使用 OR
【发布时间】:2018-02-13 11:27:29
【问题描述】:

这个eloquent 查询过滤器:

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

【问题讨论】:

标签: php eloquent laravel-5.4 laravel-eloquent


【解决方案1】:

你可以这样做:

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

【讨论】:

    【解决方案2】:

    我现在没有 Eloquent 实例可供测试,但现在会是这样吗?

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

    也就是说,你把要组合在一起的条件放到匿名函数里放在哪里?

    【讨论】:

      【解决方案3】:

      尝试将您的 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');
              });
              })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-15
        • 1970-01-01
        • 2019-12-09
        • 2018-01-26
        • 2021-07-23
        • 2020-02-07
        • 2017-11-11
        相关资源
        最近更新 更多