将所有相关字段获取到 Eloquent 中的相关字段
Getting all related fields to related field in Eloquent
我有这个数据库结构:
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.
。我该怎么做?
您要 users
合集。 $user->classrooms
是教室的合集。
如果您这样做 $user->classrooms->first()->users
,您将获得第一个教室的所有用户。
要获取所有教室的所有用户,您可以这样做;
$users = $user->classrooms->map(function ($classroom) {
return $classroom->users;
});
请注意,return 会在集合中复制用户和经过身份验证的用户。因此,您可能需要对结果进行一些过滤。
我想你可以这样做:
$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();
这对我有用:
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;
}
我有这个数据库结构:
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.
。我该怎么做?
您要 users
合集。 $user->classrooms
是教室的合集。
如果您这样做 $user->classrooms->first()->users
,您将获得第一个教室的所有用户。
要获取所有教室的所有用户,您可以这样做;
$users = $user->classrooms->map(function ($classroom) {
return $classroom->users;
});
请注意,return 会在集合中复制用户和经过身份验证的用户。因此,您可能需要对结果进行一些过滤。
我想你可以这样做:
$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();
这对我有用:
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;
}