No to tak, pierwsza rzecz jaka rzuca się w oczy to User::find(); Problem polega na tym, że w celu pobrania adresu email dla każdego usera wykonujesz za każdym razem nowe zapytanie do bazy danych. Przy większej ilości użytkowników może to być problem.
Skoro posiadasz już tablicę z ID wszystkich potrzebnych ci użytkowników to możesz zastąpić pętlę używając metody "whereIn" aby pobrać wszystkich tych userów na raz:
$users = User::whereIn('id', $usersWithAccessToCategory)->get();
Następnie jeżeli potrzebujesz tablicy z samymi adresami email możesz ją utworzyć w taki sposób:
$emails = $users->pluck('email')->toArray();
Dzięki temu zmniejszysz ilość zapytań do bazy danych z $usersWithAccessToCategory + 1 do dwóch.
No ale to póki co takie porady na przyszłość.
Można to zrobić jeszcze lepiej, bo tylko jednym zapytaniem do bazy.
Definicja relacji w modelu Usera:
public function categories(){
return $this->belongsToMany(Category::class, 'access_categories', 'user_id', 'category_id');
}
Samo wyciągnięcie adresów:
$exampleCategoryId = 3;
$emails = User::select(['email'])->whereHas('categories', function(Builder $query) use ($exampleCategoryId){
$query->where('categories.id', $exampleCategoryId);
})->get()->toArray();
Swoją drogą jeżeli masz wątpliwości to polecam metodę "enableQueryLog()" w celu sprawdzenia ile/jakie zapytania są wykonywane do bazy danych i czy nie da się tego ulepszyć.
DB::enableQueryLog();
// tutaj jakieś operacje na bazie danych
$executedQueries = DB::getQueryLog();
dd($executedQueries);