【问题标题】:Laravel Reusable Scope & Eager loadingLaravel 可重用范围和急切加载
【发布时间】: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 条路线

  1. 显示该餐厅/restaurant/{restaurantId}/menus 中所有菜单的列表
  2. 显示单个菜单项的详细信息 //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 个问题,

  1. 在控制器的 index 方法中,withRestaurantTaxes() 是我创建的一个作用域方法,类似于 show 方法上的负载约束。那么有没有办法重用范围或重组以避免重复。

  2. 在控制器的索引方法中,查询构建器是从餐厅模型创建的,像这样$restaurant->foodItems()->withRestaurantTaxes($restaurant),有什么办法可以避免通过餐厅再次作为范围方法的参数。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: php laravel eloquent scope eager-loading


    【解决方案1】:

    我认为你可以这样做:

    public function scopeWithTaxes($query)
    {
        return $query->with(['taxes' => function ($query) {
            $query->ofRestaurant($this->id);
        }]);
    }
    

    但这只有在您拥有 Restaurant 实例时才有效。

    【讨论】:

    • 您好,抱歉,这不起作用。 "$this" 是作用域 scopeWithRestaurantTaxes 方法中 FoodItem 的一个实例。
    猜你喜欢
    • 2016-08-17
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2014-08-13
    • 2021-04-23
    • 2018-10-15
    • 1970-01-01
    相关资源
    最近更新 更多