Laravel Eloquent获取所有类别的餐厅?

时间:2018-09-07 09:27:09

标签: laravel eloquent relationship

我正在尝试获取所有类别的餐厅。

我的模特:

餐厅

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 :(得分:2)

您可以像这样使用has()

Category::has('restaurants')->get();

这将返回与categories相关的restaurants


也尝试使用whereHas

$users = Category::whereHas('restaurants', function($q){
    $q->->where('district_id', $request->district)->paginate(8);
})->get();

由于您已经有一个Collection,所以我们无法查询类别,因此我建议在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循环不会在循环时生成任何额外的查询通过已经获取的数据,最后我们将在return语句中获得类别的集合。

答案 1 :(得分:1)

使用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

答案 2 :(得分:1)

您的关系应该是 Restruant.php

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

然后在您的控制器方法中只写 $restruants = Restruant::with('categories')->get();

它应该返回具有所有相关类别的所有餐馆的集合。