Laravel 5中是否有任何方法使我们的belongsToMany()
方法获得比数据透视表中描述的关系更多的关系?我希望让我的$user->movies()
方法检索分配给用户的电影以及access
列设置为public
的所有电影。没有手动查询可以吗?
我试过了:
public function movies() {
return $this->belongsToMany('App\Movie')->orWhere('access', 'public')->withTimestamps();
}
但它似乎不起作用。怎么办呢?
答案 0 :(得分:2)
这种方式不可能。你可以这样做:
$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;
为了能够进行更多过滤,您可以在模型中使用“普通”功能,只需返回查询而不调用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
不再是关系了。它只是一个返回查询构建器实例的函数。