我试图获得一个连接查询的用户列表,但它不能正常工作。我想检索除当前user_id之外的所有用户。我传入一个user_id来排除,但结果返回所有用户,它应该有一个列表的所有用户,除了当前的user_id。
它还返回来自首选项表而不是用户表的行id值。
这是我的查询。
$query = DB::table('users')
->join('preferences', function($join) use($results) {
$join->on('users.id', '=', 'preferences.UserId')
->where('preferences.ClassIdFrom', '>=', $results->ClassIdFrom)
->where('preferences.ClassIdTo', '<=', $results->ClassIdTo);
})
->where('users.id', '!=',$UserId)
->whereNotIn('users.id', $mid_query)
->whereNotIn('users.id', $last_query);
$result = $query->get();
如果我用user_id为22运行查询,结果不应该包括这个用户,所以这不起作用。
->where('users.id', '!=',$UserId)
同样,结果正确地返回用户表中的所有列,除了id列值来自首选项表。
i think after join
->where('users.id', '!=',$UserId)
->whereNotIn('users.id', $mid_query)
->whereNotIn('users.id', $last_query);
如果您没有指定要选择的字段,您将执行select *
。当您这样做时,如果多个表具有相同的字段名(例如id
),则检索的最终值将来自具有该字段的最后一个表。在这种情况下,preferences
表在users
表之后,因此两个表中具有相同名称的任何字段将以preferences
表中的数据结束。
快速解决方法是指定select语句:
$query = DB::table('users')
->join('preferences', function($join) use($results) {
$join->on('users.id', '=', 'preferences.UserId')
->where('preferences.ClassIdFrom', '>=', $results->ClassIdFrom)
->where('preferences.ClassIdTo', '<=', $results->ClassIdTo);
})
->where('users.id', '!=',$UserId)
->whereNotIn('users.id', $mid_query)
->whereNotIn('users.id', $last_query)
->select('users.*');
额外如果你要设置你的Eloquent模型和关系,你也可以用Eloquent ORM执行这个查询。
$users = User::whereHas('preferences', function($query) use ($results) {
$query->where('ClassIdFrom', '>=', $results->ClassIdFrom)
->where('ClassIdTo', '<=', $results->ClassIdTo);
})
->where('id', '!=',$UserId)
->whereNotIn('id', $mid_query)
->whereNotIn('id', $last_query)
->get();
另外,你可以稍微清理一下where's:
$ids = array_merge(array($UserId), $mid_query, $last_query);
$users = User::whereHas('preferences', function($query) use ($results) {
$query->where('ClassIdFrom', '>=', $results->ClassIdFrom)
->where('ClassIdTo', '<=', $results->ClassIdTo);
})
->whereNotIn('id', $ids)
->get();