Вы можете использовать has()
как:
Category::has('restaurants')->get();
Это вернет categories
, которые связаны с restaurants
.
Попробуйте также использовать whereHas
как:
$users = Category::whereHas('restaurants', function($q){
$q->->where('district_id', $request->district)->paginate(8);
})->get();
Поскольку у вас уже есть коллекция, мы не можем запрашивать категории, поэтому я предлагаю добавить функцию для области, которая внутри модели Restaurant
, например:
public static function getCategoriesOfRestaurants($restaurants)
$categories = [];
foreach($restaurants as $restaurant){
array_push( $categories, $restaurant->categories->pluck('id')->toArray());
}
return Category::WhereIn('id', array_unique($categories))->get();
}
Тогда просто позвоните, когда получите коллекцию $restaurants
:
$restaurants = Restaurant::with("categories")->where('district_id', $request->district)->paginate(8);
$categories = Restaurant::getCategoriesOfRestaurants($restaurants);
Примечание: Использование with("categories")
при получении коллекции будет запрашивать все связанные категории в первом запросе, поэтому цикл foreach
не будет генерировать никаких дополнительных запросов, просто повторяя циклы по уже извлеченным данным. и, наконец, мы получим коллекцию категорий в операторе возврата.