过滤雄辩

时间:2015-11-04 06:16:11

标签: php laravel eloquent

我试图根据用户是否有权访问模型来过滤我的Eloquent模型集合。

我当前的方法有效,但它确实很慢,所以我想知道是否有更高效的方法来做它?

我在集合中的每个模型上都有userHasAccess()方法。 它使用Laravel的ACL功能来确定用户是否可以访问模型:

public function userHasAccess()
{
    if (Auth::user()->can('show', $this)) {
        return true;
    }

    return false;
}

然后我覆盖模型上的newCollection()方法:

public function newCollection(array $models = Array())
{
    $collection = new Collection($models);

    $collection = $collection->filter(function($model)
    {
        if($model->userHasAccess())
            return true;
    });

    return $collection;
}

政策方法如下:

public function show(User $user, Quote $quote)
{
    if(!$quote->customer)
        return false;

    if(($user->id === $quote->user_id))
        return true;

    if($user->hasRole(['super-admin','admin']))
        return true;

    return false;
}

有更好的方法吗?特别是在性能方面?

1 个答案:

答案 0 :(得分:2)

您可以将逻辑添加到查询中并显着加快速度

$query = User::query();

if(!Auth::user()->hasRole(['super-admin','admin'])){
    $query->where('user_id','=',Auth::id);
}

$data = $query->get();

您可以使用范围

在更大范围内执行此操作
class User extends Model
{
    public function scopeLimitByUser($query)
    {
        if(!Auth::user()->hasRole(['super-admin','admin'])){
            $query->where('user_id','=',Auth::id);
        }
    }
}

然后,对于报价客户,您可以添加查询的位置

$query->whereNotNull('customer_id');