我正在尝试获取所有类别的餐厅。
我的模特:
餐厅
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-> ????;
请帮助我做到这一点,谢谢!
答案 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();
它应该返回具有所有相关类别的所有餐馆的集合。