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 查询生成器实例的函数。
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 查询生成器实例的函数。