我有这个数据库结构:
classroom_user
是Elqouent的多对多支点。
user.php的:
public function classrooms() {
return $this->belongsToMany(ClassRoom::class, 'classroom_user', 'classroom_id', 'user_id');
}
ClassRoom.php :
public function users()
{
return $this->belongsToMany(User::class, 'classroom_user', 'user_id', 'classroom_id');
}
我有一个$user
,并且想要编写一个Eloquent方法,该方法可以让所有$user
所在教室中至少有一个教室的用户。$user->classrooms->users
之类的东西。但这会导致错误Property [users] does not exist on this collection instance.
。我怎么能这样做?
答案 0 :(得分:2)
我认为你可以这样做:
$users = User::whereHas('classrooms', function($query) {
$query->whereHas('users', function($query) {
$query->where('id', auth()->user()->id);
});
})->get();
您可以将其存储为User
模型中的范围:
public function scopeClassmatesOf($query, $user)
{
$query->whereHas('classrooms', function($query) use($user) {
$query->whereHas('users', function($query) use($user) {
$query->where('id', $user->id);
});
})
}
然后从控制器中调用它,如:
$user = auth()->user();
$users = User::classmatesOf($user)->get();
答案 1 :(得分:0)
您要求收集users
。 $user->classrooms
是教室的集合。
如果您$user->classrooms->first()->users
,您将从第一间教室获得所有用户。
要让所有教室的所有用户都可以这样做,
$users = $user->classrooms->map(function ($classroom) {
return $classroom->users;
});
请注意,将在集合中返回重复的用户和经过身份验证的用户。因此,您可能需要对结果进行一些过滤。
答案 2 :(得分:0)
这对我有用:
public function classmates() {
$self = $this;
$a = User::with('classrooms')->whereHas('classrooms', function ($query) use ($self) {
$query->whereHas('users', function ($query) use ($self) {
$query->where('users.id', $self->id);
});
});
return $a;
}