Laravel。破解查询

时间:2015-08-28 13:24:30

标签: php laravel join

我有一个我不明白的错误。我有一个users表和firsts, seconds, thirds表。

我写了一个查询,该查询应该选择所有用户,其中状态在firsts, seconds, thirds表中被批准(取决于状态)。

目前,我的用户具有firsts and seconds状态pending,但查询仍然找到了他。你能解释一下我做错了什么吗?在这种情况下,您建议使用哪种方式?这是我的疑问:

$users = User::whereIn('users.status', array(2, 3))
            ->leftJoin('firsts', 'firsts.user_id', '=', 'users.id')
            ->leftJoin('seconds', 'seconds.user_id', '=', 'users.id')
            ->leftJoin('thirds', 'thirds.user_id', '=', 'users.id')
            ->where(function($query) {
              $query->where('users.status', 2);
              $query->where('firsts.status', 'approved');
              $query->where('seconds.status', 'approved');
            })
            ->orWhere(function($query) {
              $query->where('users.status', 3);
              $query->where('users.stripe_active', '1');
              $query->orWhere('users.subscription_ends_at', '!=', 'NULL');
              $query->where('firsts.status', 'approved');
              $query->where('seconds.status', 'approved');
              $query->where('thirds.status', 'approved');
            })
            ->groupBy('users.id')
            ->select('users.id')
            ->get();

修改

所以我仍然无法找到解决方案。以下是用户ID的结果数组:[3,6,7]

ID为3的用户:

Firsts status = 'pending',
Seconds status = 'approved',
Thirds status = 'approved'.

ID为6的用户:

Firsts status = 'pending',
Seconds status = 'pending',
Thirds status = 'approved'.

ID为7的用户:

Firsts status = 'approved',
Seconds status = 'approved',
Thirds status = 'approved'.

正如您所见,user id 36不应该在数组中。

1 个答案:

答案 0 :(得分:1)

您不会过滤user.status = 2的第三个表中的数据,并重新排列user.status = 3的where子句

最好只加入状态得到批准的用户。这将加快查询速度。

$users = User::whereIn('users.status', array(2, 3))
            ->leftJoin('firsts', function($join){
                $join->on('firsts.user_id', '=', 'users.id')
                     ->where('firsts.status','=', 'approved');
                })
            ->leftJoin('seconds', function($join){
                $join->on('seconds.user_id', '=', 'users.id')
                     ->where('seconds.status','=', 'approved');
                })
            ->leftJoin('thirds', function($join){
                $join->on('thirds.user_id', '=', 'users.id')
                     ->where('third.status','=','approved');
                })
            ->where(function($query) {
              $query->where('users.status', 2);
              $query->where('firsts.status','=', 'approved');
              $query->where('seconds.status','=', 'approved');
              $query->where('thirds.status','=', 'approved');  
            })
            ->orWhere(function($query) {
              $query->where('users.status', 3);
              $query->where(function($q){
                  $q->where('users.stripe_active', '1');
                  $q->orWhereNotNull('users.subscription_ends_at');
              });
              $query->where('firsts.status','=', 'approved');
              $query->where('seconds.status','=', 'approved');
              $query->where('thirds.status','=', 'approved');
            })
            ->groupBy('users.id')
            ->select(['users.id'])
            ->get();