在Eloquent中将所有相关字段提供给相关字段

时间:2017-11-19 15:54:14

标签: php laravel laravel-5 eloquent laravel-eloquent

我有这个数据库结构:

DB stucture

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.。我怎么能这样做?

3 个答案:

答案 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;
    }