【发布时间】:2021-07-19 07:05:46
【问题描述】:
我有三个模型:Restaurant、FoodItems、Taxes,具有以下关系
Restaurant belongsToMany FoodItems (vice versa)
FoodItems belongsToMany Taxes (vice versa)
Restaurant hasMany Taxes (Taxes belongsTo Restaurant)
我有 2 条路线
- 显示该餐厅/restaurant/{restaurantId}/menus 中所有菜单的列表
- 显示单个菜单项的详细信息 //restaurant/{restaurantId}/menus/{id}
处理上述情况的MenuController如下
public function index(Restaurant $restaurant, Request $request)
{
$query = $restaurant->foodItems()->withRestaurantTaxes($restaurant);
$query->ofCategories($request->get('category'));
return $query->get();
}
public function show(Restaurant $restaurant, FoodItem $foodItem, Request $request)
{
$foodItem->load(['taxes' => function ($query) use ($restaurant) {
$query->ofRestaurant($restaurant->id);
}]);
return $foodItem;
}
餐厅模型有如下关系
public function foodItems()
{
return $this->belongsToMany(FoodItem::class, 'restaurant_food_items');
}
食品项目模型有以下内容
public function taxes()
{
return $this->belongsToMany(Tax::class, 'food_item_taxes');
}
public function scopeWithRestaurantTaxes($query, $restaurant)
{
return $query->with(['taxes' => function ($query) use ($restaurant) {
$query->ofRestaurant($restaurant->id);
}]);
}
税收模型有以下几种
public function restaurants()
{
return $this->belongsTo(Restaurant::class);
}
public function scopeOfRestaurant($query, $restaurantId)
{
return $query->where('restaurant_id', $restaurantId);
}
我的代码有 2 个问题,
-
在控制器的 index 方法中,withRestaurantTaxes() 是我创建的一个作用域方法,类似于 show 方法上的负载约束。那么有没有办法重用范围或重组以避免重复。
-
在控制器的索引方法中,查询构建器是从餐厅模型创建的,像这样$restaurant->foodItems()->withRestaurantTaxes($restaurant),有什么办法可以避免通过餐厅再次作为范围方法的参数。
任何帮助将不胜感激。
谢谢。
【问题讨论】:
标签: php laravel eloquent scope eager-loading