2015-11-04 6 views
3

Я пытаюсь отфильтровать коллекции моделей Eloquent на основе того, имеет ли пользователь доступ к модели или нет.Filtering 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; 
} 

Есть ли лучший способ сделать это? Особенно с точки зрения производительности?

ответ

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); 
     } 
    } 
} 

Тогда для цитаты клиента вы можете добавить a где к запросу

$query->whereNotNull('customer_id'); 
+0

Спасибо - я закончил делать что-то подобное, поэтому спасибо за подтверждение моего направления. Мне также нравится идея использования области запроса. – HPage