2017-10-03 5 views
0

J'ai une application Laravel qui nécessite deux tables distinctes pour les produits. Un modèle PurchaseProduct gère les produits que nous allons acheter de nos clients. Un autre modèle SaleProduct gère le produit que nous allons vendre à nos clients.Définir dynamiquement le modèle cible d'une relation Eloquent Model?

Nous utilisons un modèle unique Category pour gérer les produits. Nous avons un tableau pivotant category_products pour gérer les relations produit/catégorie. Il a simplement des colonnes category_id et product_id.

Étant donné que mon application est une API, je souhaite recevoir un paramètre de requête lorsqu'une demande est envoyée à mon point de terminaison. Comme si: /api/category&type=ppPP se traduira évidemment en PurchaseProduct et SP à SaleProduct.

Ok, donc ce que je suis désireux de faire est d'avoir une relation déclarée sur mon modèle 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(); 
} 

Comme vous pouvez le voir, je ne suis pas sûr comment définir cette instruction conditionnelle pour déclencher le modèle que je veux utiliser pour la relation. Si elle était basée sur une base de données, ce ne serait pas si difficile, mais comment pourrais-je en quelque sorte passer ce paramètre de requête au modèle et définir dynamiquement le bon modèle de produit?

+0

Peut-être que cela fonctionnera pour vous? https://laravel.com/docs/5.2/eloquent-relationships#polymorphic-relations – NSSec

Répondre

0

Le modèle n'est généralement pas la bonne position pour une telle logique, cela devrait être fait par le contrôleur.

Dans le modèle de la catégorie il suffit d'ajouter deux relations:

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

Maintenant, vous pouvez faire quelque chose comme ceci dans votre contrôleur:

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

Vous avez d'adapter le principal à vos besoins.