我有2个模型 - User和RoleUser。每个用户都被分配到一个角色。因此,我通过宣布一个“角色”来定义一对一的关系。用户模型上的方法。
public function role(){
return $this->hasOne('Vanguard\RoleUser', 'user_id');
}
这是我的角色模型
class RoleUser extends Model
{
//
public $table = 'role_user';
protected $fillable = ['user_id', 'role_id'];
}
在控制器中,我尝试使用role_id = 2获取用户,但查询仍然返回所有用户(即3)而不是仅返回一个用户。 这是我的控制器
$users = User::with(['role' => function ($query) {
$query->where('role_id', 2);
}])->get();
请问是什么造成的?
答案 0 :(得分:1)
将范围与with
一起使用只会将范围添加到预先加载的关系中,无论它是否存在。要实现您的目标,您还需要whereHas
。
$users = User::whereHas('role', function ($q) {
$q->where('role_id', 2);
})->with(['role' => function ($q) {
$q->where('role_id', 2);
}])->get();
答案 1 :(得分:0)
将查询更改为:
User::all()->with('role')->where('role_id', 2)->get()
我希望这有帮助。
答案 2 :(得分:0)
假设您已定义:
然后您可以简单地将查询写为:
$role = Role::with('users')->find(2);
$users = $role->users;
以上示例将为您提供角色ID为2的所有用户。
答案 3 :(得分:0)
假设每个用户可能只有一个角色,请尝试一下:
在用户模型中:
class User extends Model
{
public function role()
{
return $this->belongsTo(RoleUser::class);
}
}
在 RoleUser 模型中:
class RoleUser extends Model
{
public function users()
{
return $this->hasMany(User::class);
}
}
现在,获取您需要的数据(首先在Tinker中尝试):
// Users with role_id 2
$users = User::where('role_id', 2)->get();
// Eager load the Role model to get the entire Role record for each user
$users = User::with('role')->where('role_id', 2)->get();
// Get role's where role_id is 2, and eager load the users
$role = RoleUser::with('users')->where('id', 2)->get();