【问题标题】:Dynamically set the target model of an Eloquent Model relationship?动态设置 Eloquent Model 关系的目标模型?
【发布时间】:2017-10-03 21:11:19
【问题描述】:

我有一个 Laravel 应用程序,它需要两个单独的产品表。一个模型PurchaseProduct 处理我们将我们的客户购买的产品。另一个模型 SaleProduct 处理我们将出售给我们的客户的产品。

我们使用单一的Category 模型来管理产品。我们有一个数据透视表category_products 来管理产品/类别关系。它只有category_idproduct_id 列。

因为我的应用程序是一个 API,所以我希望在向我的端点发出请求时接收查询参数。像这样:/api/category&type=ppPP 显然会转换为PurchaseProductSPSaleProduct

好的,所以我想做的是在我的Category 模型上声明一个关系:

public function products()
{
    if ( -- ) {
        $model = 'App\Models\SaleProduct';
    } else {
        $model = 'App\Models\PurchaseProduct';
    }
    return $this->belongsToMany($model, 'category_products', 'category_id', 'product_id')->withTimestamps();
}

如您所见,我不确定如何设置此条件语句来触发我想用于关系的模型。如果它是基于数据库的,它不会那么难,但我怎么能以某种方式将该查询参数传递给模型并动态设置正确的产品模型?

【问题讨论】:

标签: php database laravel eloquent


【解决方案1】:

Model通常不适合做这样的逻辑,这应该由Controller来做。

在类别模型中只需添加两个关系:

public function saleProducts()
{
    return $this->belongsToMany('App\Models\SaleProduct', 'category_products', 'category_id', 'product_id')->withTimestamps();
}

public function purchaseProducts()
{
    return $this->belongsToMany('App\Models\PurchaseProduct', 'category_products', 'category_id', 'product_id')->withTimestamps();
}

现在您可以在 Controller 中执行以下操作:

public function index(Request $request)
{
    $categories = Category::where('id', $request->get('category_id'));

     switch ($request->get('type'))
     {
         case 'PP':
             $products = $categories->purchaseProducts()->get();
             break;
         case 'SP':
             $products = $categories->purchaseProducts()->get();
             break;
         default:
             throw new InvalidArgumentException('Wrong parameter');
     }

     return $products->toArray();
}

您必须使主体适应您的确切需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-07
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2013-02-26
    • 2015-10-29
    • 2016-02-26
    相关资源
    最近更新 更多