передать коллекцию записей в политику

#laravel

Вопрос:

это моя структура таблиц :

введите описание изображения здесь

я хочу получить все записи состояния запроса, где Request_status.Department_id равен идентификатору пользователя.Department_id . и пользователь может видеть только собственные записи request_state .я определил политику для обработки этого задания, но эта политика может обрабатывать только 1 запись request_state. эта политика не может обрабатывать массив модели request_state ! как я могу использовать get() вместо first()

Политика :

 public function view(User $user, RequestState $requestState)
{
    return$user->department_id===$requestState->department_idamp;amp;$user->hasRole('department');
 }
 

Контроллер :

  public function show_request()
 {
     $RequestState=RequestState::where('department_id',auth()->user()->department_id)->first();
     nullable($RequestState)->getOrSend(function (){
        return Responder::requestDoesNotFound();
     });
     if(auth()->user()->can('view',$RequestState)){
         return 'ok';
     }

  }
 

Комментарии:

1. @TimLewis в порядке, извини

Ответ №1:

Политика в порядке как есть. Изменения должны быть внесены в контроллер.

Вызывается ваш метод контроллера show_request() . Название подразумевает, что он показывает один запрос. Но логика контроллера показывает, что он показывает все запросы для пользователя. Вам нужно либо проверить каждый запрос по отдельности, либо предположить, что все запросы имеют один и тот же идентификатор department_id, так как это то, что вытягивает ваш запрос. Предполагая, что вы хотите проверить все состояния запросов в коллекции, вы можете свести их к одному значению TRUE/FALSE;

 public function show_request()
{
    $requestStates = RequestState::where('department_id', auth()->user()->department_id)->fget();
    nullable($RequestState)->getOrSend(function (){
       return Responder::requestDoesNotFound();
    });
    return $requestStates->reduce(function ($accumulator, $requestState) {
        return $accumulator and auth()->user()->can('view', $requestState);
    }, TRUE);
  }
 

Ответ №2:

Как я вижу, вы хотите разрешить пользователям просматривать список запросов, к которым у них есть доступ. Вы можете создать новый метод в своем методе контроллера для проверки всех запросов.

Это должно быть что-то вроде этого:

 public function show_requests()
    {
        
        $requestStates = RequestState::where('department_id',auth()->user()->department_id)->get();

        if(sizeof($requestStates) > 0 ){

            for($i = 0; $i < size($requestStates); $i   ) {
        
                if (!(auth()->user()->can('view', $requestStates[$i]))) {
                    //Unset the record the user can't see
                    unset($requestStates[$i]);
                }
                
            }
            
            //Return all records the user can see
            return $requestStates;
            
        }     
         else {
        return Responder::requestDoesNotFound();
        }
         
    }