我有一个我不明白的错误。我有一个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 3
和6
不应该在数组中。
答案 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();