将所有相关字段获取到 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;
    }