拉拉维尔属于许多与所有行模型


laravel belongsToMany with all rows of model

>我有一个属于用户和资源的多属性关系。

用户:

    public function resources() {
        return $this->belongsToMany('Resource')->withPivot(array('value'));
    }

资源:

    public function users() {
        return $this->belongsToMany('User')->withPivot(array('value'));
    }

中间表resource_user 。跟:

$resources = Sentry::getUser()->resources()->get();

我获得了user_id在resource_user表中的所有资源。目前为止,一切都好。但是我怎样才能获得所有资源条目,甚至中间表中不存在user_id?假设我在资源表中有 3 个资源。ID 1、2 和 3。我有一个 ID 为 1 的用户。在中间表中,我只有 2 行:

resource_id 1 和user_id 1 和值 50。

resource_id 2 和 user_id 1 和值 100。

但是我想显示所有资源,如果用户不在那里,应该有资源对象但没有用户的关系模型。

whereHas无法解决此问题。

所以我的目标是得到 3 个结果,而不是 2 个。像这样:

resource_id 1 user_id 1 值 50

resource_id 2 user_id 1 值 100

resource_id 3 user_id 0 值 0

我唯一想通的是:

在资源模型中,我创建了一个这样的函数:

    # Get specific User value from resource
    public function userValue() {
        $res_user = DB::table('resource_user')->whereUserId(Sentry::getUser()->id)->whereResourceId($this->id)->first();
    if($res_user){
        return $res_user->value;
    }else{
        return 0;
    }
}

但我想知道有没有一种更干净雄辩的方法?有什么想法吗?

我不确定我是否正确理解你,但要获得"所有资源",你可以使用Resource模型:

$resources = Resource::with('users')->get();

要仅预先加载当前用户,您可以添加过滤闭包:

$resources = Resource::with(array('users' => function($q) use ($userId){
    $q->where('user_id', $userId);
}))->get();