Laravel Eloquent получить все категории ресторанов - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь получить все категории ресторанов.

Мои модели:

Ресторан

public function categories()
{
    return $this->belongsToMany(Category::class,'restaurant_categories_relation','restaurant_id');
}

Категория

public function restaurants()
{
    return $this->belongsToMany(Restaurant::class,'restaurant_categories_relation', 'category_id');
}

В моем контроллере:

$restaurants = Restaurant::where('district_id', $request->district)->paginate(8);
$categories = $restaurants-> ????;

Пожалуйста, помогите мне сделать это, спасибо!

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Вы можете использовать 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 не будет генерировать никаких дополнительных запросов, просто повторяя циклы по уже извлеченным данным. и, наконец, мы получим коллекцию категорий в операторе возврата.

0 голосов
/ 07 сентября 2018

Ваше отношение должно быть Restruant.php

public function categories() {
    return $this->belongsToMany(Category::class,'restaurant_categories_relation','restaurant_id','category_id');
}

тогда в вашем контроллере метод просто wirte $restruants = Restruant::with('categories')->get();

Он должен вернуть вам коллекцию всех реструктурирующих со всеми связанными категориями.

0 голосов
/ 07 сентября 2018

используйте with() метод для загрузки, который обеспечивает получение всех категорий в одном запросе

$restaurants = Restaurant::with("categories")->where('district_id', $request->district)->paginate(8);
foreach($restaurants as $restaurant){
  foreach($restaurant->categories as $category)
     {{$category}}
  }
}

если вы хотите использовать категории вне цикла, тогда присвойте эти категории переменной

foreach($restaurants as $restaurant){
  $categories = $restaurant->categories;
}

// do something with $categories
...