Laravel还有许多关系

时间:2015-02-17 19:05:28

标签: php laravel eloquent laravel-5

Laravel 5中是否有任何方法使我们的belongsToMany()方法获得比数据透视表中描述的关系更多的关系?我希望让我的$user->movies()方法检索分配给用户的电影以及access列设置为public 的所有电影。没有手动查询可以吗?

我试过了:

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

但它似乎不起作用。怎么办呢?

1 个答案:

答案 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不再是关系了。它只是一个返回查询构建器实例的函数。