Laravel 中的其他多对多关系

Additional many to many relations in Laravel

Laravel 5 中有什么方法可以使我们的 belongsToMany() 方法获得比 pivot table 中描述的更多的关系吗?我想让我的 $user->movies() 方法检索分配给用户 的电影以及 access 列设置为 public 的所有电影。不用人工查询可以吗?

我试过这个:

public function movies() {
    return $this->belongsToMany('App\Movie')->orWhere('access', 'public')->withTimestamps();
}

但是好像不行。怎么做到的?

这是不可能的。你可以这样做:

$userId = 1;
$movies = App\Movie::whereHas('users', function($q) use ($userId){
    $q->where('user_id', $userId);
})->orWhere('access', 'public')->get();

您可以将整个内容放入 User 模型中的属性访问器中,但您将无法预先加载它。

public function getAvailableMoviesAttribute(){
    $userId = $this->getKey();
    $movies = App\Movie::whereHas('users', function($q) use ($userId){
        $q->where('user_id', $userId);
    })->orWhere('access', 'public')->get();
    return $movies;
}

用法:

$user = User::find(1);
$user->availableMovies;

为了能够进行更多过滤,您可以在模型中使用 "normal" 函数,并且只 return 查询而不调用 get()

public function movies(){
    $userId = $this->getKey();
    return App\Movie::whereHas('users', function($q) use ($userId){
        $q->where('user_id', $userId);
    })->orWhere('access', 'public');
}

用法:

$user->movies()->where('title', 'LIKE', B%')->get()

注意现在movies不再是一段关系了。它只是一个 return 查询生成器实例的函数。