我试图根据用户是否有权访问模型来过滤我的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;
}
有更好的方法吗?特别是在性能方面?
答案 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');