Как я могу зациклить коллекцию Eloquent в PHP Laravel?

#php #laravel #collections #eloquent

#php #laravel #Коллекции #eloquent

Вопрос:

Я пытаюсь использовать команды Laravel Jetstream для автоматической регистрации. Из-за того, что Jetstreams требует «персональной команды», а мое приложение требует, чтобы пользователи были разделены на определенные команды, я нашел способ обойти это, чтобы attach пользователь был в команде, а затем switchTeam их текущая команда загружалась так же, как их личная команда.

Чтобы это сработало, я отключил ручную регистрацию, отключил возможность создавать новые команды и отключил возможность для людей покидать команды. Это экономит время на удаление личных команд из Jetsteam.

При этом, поскольку приложение автоматически создает пользователей (из электронной таблицы), мне также нужно назначить команду этому пользователю. Я пытаюсь перебрать каждый Team::all из них, но ответ представляет собой массив, поэтому my array_filter возвращает ошибку из-за того, что в качестве параметра указан объект.

 protected function assignTeam(User $user)
{
    $team = array_filter(Team::all(), function(Team $team) {
        // teamToAssign dervies from Spreadsheet data
        return strtoupper($team->name) === strtoupper($this->teamToAssign);
    });
    
    if(!empty($team)) // User error can exist in data
    {
        Team::find($team->id)->users()->attach($user, ['role' => 'participant']);
        User::find($user->id)->switchTeam(Team::find($team->id));
        return;
    }

    // TODO: Deal with user error
}
  

Может кто-нибудь, возможно, пролить свет на то, как я могу подойти к этому? Я новичок в Laravel и не уверен, есть ли лучший метод для выполнения цикла Eloquent Collections . Заранее большое спасибо.

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

1. Как насчет того, чтобы попробовать filter метод Laravel Collections. Кроме того, возможно, вы захотите использовать этот first() метод, чтобы получить только один результат

Ответ №1:

Вы можете сделать

 $teams = Team::all()->toArray(); // this will convert collection to array 

// or

Team::all()->each(function (Team $team) { // this will allow you to loop through the collection 

   // TODO ...

});

Team::all()->filter(function (Team $team) { // this will allow you to filter unwanted instances

   // TODO ...

});

  

Для получения дополнительной информации о вспомогательных методах сбора Laravel здесь

Ответ №2:

Вы можете использовать метод filter для фильтрации вашей коллекции, как показано по следующей ссылке:

https://laravel.com/docs/8.x/collections#method-filter

Здесь вы также можете найти множество методов при работе с коллекциями