动态设置Eloquent Model关系的目标模型?

时间:2017-10-03 21:11:19

标签: php database laravel eloquent

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

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

由于我的应用是API,因此我希望在向端点发出请求时收到查询参数。像这样:/api/category&type=pp PP显然会转换为PurchaseProductSP转换为SaleProduct

好的,我想要做的是在我的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();
}

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

1 个答案:

答案 0 :(得分:0)

模型通常不是正确的位置做这样的逻辑,这应该由控制器来完成。

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

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();
}

你必须根据你的确切需要调整校长。