我正在尝试获取具有连接查询的用户列表,但它无法正常工作。我想检索除当前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列值来自首选项表。
我认为加入后
->where('users.id', '!=',$UserId)
->whereNotIn('users.id', $mid_query)
->whereNotIn('users.id', $last_query);
这两个都不起作用
答案 0 :(得分:3)
如果您未指定要选择的字段,则会执行select *
。执行此操作时,如果多个表具有相同的字段名称(例如id
),则检索的最终值将来自包含该字段的最后一个表。在这种情况下,preferences
表位于users
表之后,因此两个表中具有相同名称的任何字段都将以preferences
表中的数据结束。
快速解决方法是指定您的选择语句:
$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();
此外,你可以稍微清理一下你的位置:
$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();