雄辩所有记录关系

时间:2018-04-02 21:07:25

标签: php laravel eloquent

我正在尝试构建另一种关系,它返回所有记录而不是仅返回相关记录。我试过返回一个查询构建器,但这不起作用,它必须是一个关系。我应该返回什么才能使这项工作?

public function devices()
{
    if ($this->admin) {
        // return all devices relationship instead
    } else {
        return $this->belongsToMany('Device', 'permissions');
    }
}

小提琴:https://implode.io/XXLGG8

编辑:我想在大多数情况下继续构建查询,而不仅仅是获取设备。

3 个答案:

答案 0 :(得分:0)

模型中的devices()函数应该返回一个关系,你不应该在那里添加if语句。让你的devices()功能如下:

public function devices()
{
    return $this->belongsToMany('Device', 'permissions');
}

在您的用户模型中添加新功能:

public function getDevices() {
    if($this->admin === true) {
        return Device::all(); 
    } 

    return $this->devices();
}

现在你可以做到:

$admin->getDevices(); // will return all devices
$user->getDevices(); // will return only relations

答案 1 :(得分:0)

我实际上采用了稍微不同的方式并使用了范围:

protected function scopeHasAccess($query, User $user)
{
    if ($user->admin) {
        return $query;
    }

    return $query->join('permissions', 'permissions.device_id', "devices.id")
        ->where('permissions.user_id', $user->user_id);
}

答案 2 :(得分:0)

devices accessor方法添加到User模型并在那里实现您的逻辑。

public function getDevicesAttribute() {
    if ($this->admin) {
        return Device::all();
    }
    return $this->getRelationValue('devices');
}

请参阅更新的“fiddle”。