【问题标题】:Nested 'AND OR' Query in EloquentEloquent 中的嵌套“AND OR”查询
【发布时间】:2014-09-27 13:01:45
【问题描述】:

我目前正在尝试创建嵌套查询,如下所示:

public function getChallenge($user_id, $opponent_id)
{
    $challenge = $this->challenges()
            ->where('open', true)
            ->where(function($query) use ($user_id, $opponent_id) {
                    $query->where('player_1', $user_id)
                          ->where('player_2', $opponent_id);
                })
                 ->orWhere(function($query) use ($opponent_id, $user_id) {
                    $query->where('player_1', $opponent_id)
                          ->where('player_2', $user_id);
                })
            ->first();

    return $challenge;
}

这将创建以下查询,例如:

select * from `site_challenges_leagues` 
where `site_challenges_leagues`.`league_id` = '1' 
and `open` = '1'
and (`player_1` = '3' and `player_2` = '1') 
or (`player_1` = '1' and `player_2` = '3') 
limit 1

但是,这总是返回表中的第一个值(其中open10),这是不正确的。为了使查询正确,它需要在括号中包含两组 AND 查询,如下所示:

 select * from `site_challenges_leagues` 
 where `site_challenges_leagues`.`league_id` = '1' 
 and `open` = TRUE 

 and ((`player_1` = '3' and `player_2` = '1') 
 or (`player_1` = '1' and `player_2` = '3'))

 limit 1

在 Laravel 中可以做到这一点吗?我试图这样做;但是,它失败了:

public function getChallenge($user_id, $opponent_id)
{
    $challenge = $this->challenges()
            ->where('open', true)
            ->where(function($q) use ($user_id, $opponent_id) {
                $q->where(function($query) {
                        $query->where('player_1', $user_id)
                              ->where('player_2', $opponent_id);
                    })
                  ->orWhere(function($query) {
                        $query->where('player_1', $opponent_id)
                              ->where('player_2', $user_id);
                    })
                })
            ->first();

    return $challenge;
}

非常感谢任何帮助。

【问题讨论】:

    标签: laravel laravel-4 eloquent


    【解决方案1】:

    你已经非常接近答案了

    $challenge = $this->challenges()
            ->where('open', true)
            ->where(function($q) use ($user_id, $opponent_id) {
                $q->where(function($query) use ($opponent_id, $user_id){
                        $query->where('player_1', $user_id)
                              ->where('player_2', $opponent_id);
                    })
                  ->orWhere(function($query) use ($opponent_id, $user_id) {
                        $query->where('player_1', $opponent_id)
                              ->where('player_2', $user_id);
                    });
                })
            ->first();
    

    Here是两个代码的区别

    【讨论】:

      【解决方案2】:

      我需要嵌套的 wheres 来按多个字段搜索用户:

          $users_query->where('company_uuid', '=', $company_uuid);
          $users_query->where('is_active', '=', true);
          $users_query->whereNested(function($query) use ($search){
              /** @var Builder $query */
              $query
                  ->where('first_name', 'like', '%' . $search . '%')
                  ->orWhere('last_name', 'like', '%' . $search . '%')
                  ->orWhere('email', 'like', '%' . $search . '%');
          });
      

      假设您想堆叠where 层而不会在使用orWhere 时丢失它们 这不是一回事吗?

         $challenge = $this->challenges()
             ->where('open', true)
             ->whereNested(function($q) use ($user_id, $opponent_id) {
                 $query->where('player_1', $user_id)
                     ->where('player_2', $opponent_id);
      
                 $query->orWhere('player_1', $opponent_id)
                     ->where('player_2', $user_id);
         })->first();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-19
        • 2020-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多