Eloquent Global范围内的空模型?

时间:2018-05-16 03:44:41

标签: php laravel eloquent laravel-5.5

我正在尝试确定用户是否能够更新全局范围内的模型,但我使用的是通常通过关系获得的权限前缀。

申请代码如下:

public function apply(Builder $builder, Model $model)
{
    $user = getUser();

    if ($user === null || $user->cannot('update', $model)) {
        $builder->where('active', '=', 1);
    }
}

当我dd($model)模型实际上没有实例化时,所以当我执行更新权限时,请检查我的策略:

public function update(User $user, Item $item)
{
    return $user->hasAnyPermission(['edit-things', $this->prefix($item) . "-edit-item"]);
}

前缀函数如下所示:

private function prefix(Item $item = null)
{
    if ($item !== null) {
        return $item->parentRelation->roles_permission_prefix;
    }
    $parentRelation= ParentRelation::findOrFail(request('parent_relation_id'));
    return $parentRelation->roles_permission_prefix;
}

由于他们没有成为一种关系,所有这一切都失败了。有什么想法吗?

快速编辑:如果相关,我正在使用Spatie Permissions库。

1 个答案:

答案 0 :(得分:0)

唯一能够打破缺失关系的函数是prefix()函数。

您可以通过检查条件列表中的prefix()$model是否也为空来阻止调用$model->parentRelation

public function apply(Builder $builder, Model $model)
{
    $user = getUser();

    if (   $user === null 
        || $model === null 
        || (method_exists($model, 'parent_relation') && !$model->parentRelation)
        || $user->cannot('update', $model)
    ) {
        $builder->where('active', '=', 1);
    }
}