2017-07-07 1 views
0

J'ai créé un formulaire de recherche, mais j'ai besoin d'aide dans la façon d'interroger les données et les résultats:requêtes multiples options attributs

Fondamentalement, j'ai une liste de produits, et il y a un product_type dans chaque produit et Chaque produit peut également avoir de nombreux attributs de matériaux.

J'ai déjà fait la requête pour obtenir le type de produits, et c'est facile puisque le product type id est dans la même table (produits) mais que je dois filtrer les produits avec les matériaux (attributs) sélectionnés par l'utilisateur.

Mon contrôleur:

public function searchResults(Request $request) 
    { 

    if($request->has('type')){ 
     $type = $request->type; 
    } 
    if($request->has('material')){ 
     $material = $request->material; 
    } 

    $query = \DB::table('products'); 

    //only one type    
    if ($request->has('type') && $type) { 
     $query->where('product_type_id', $type); 
    } 

    // multiple values 
    if ($request->has('material') && $material) { 
//create query to get all the products with the materials selected 
// the materials request comes in a array of ids ([1,2,3]).. 
    } 

    $products = $query->get(); 

    return view('catalogs.index',compact('products')); 

    } 
} 

Modèle de produit:

class Product extends Model 
{ 

    public function photos() 
    { 
     return $this->hasMany(ProductImage::class, 'product_id','id'); 
    } 

    public function businessAreaName() 
    { 
     return $this->hasOne(ProductBusinessarea::class,'id','product_businessarea_id'); 
    } 

    public function typeName() 
    { 
     return $this->hasOne(ProductType::class,'id','product_type_id'); 
    } 

    public function businessAttributes() 
    { 
     return $this->hasMany(ProductAttributeBusinessarea::class); 
    } 

    public function materialAttributes() 
    { 
     return $this->hasMany(ProductAttributeMaterial::class); 
    } 

    public function areas(){ 
     return $this->belongsToMany(ProductAttributeBusinessarea::class); 
    } 
    public function materials(){ 
     return $this->belongsToMany(ProductAttributeMaterial::class); 
    } 
} 

BASE DE DONNÉES:

produits

  • id
  • Nom
  • type_id

product_attribute_materials

  • Product_ID
  • product_material_id

product_materials

  • id
  • Nom

Comment puis-je combiner la requête pour obtenir tous les produits avec les matériaux choisis?

+1

Pouvez-vous ajouter votre modèle Eloquent à ses relations? – OuailB

+0

oui je crois que je peux, mais comment je ferais cette combinaison? Je dois passer les paramètres des matériaux, comment je ferais dans le modèle de produit? –

+1

@OuailB signifie que vous pouvez montrer votre code de modèle Eloquent et l'ajouter à la question !! – Maraboc

Répondre

0

Vous pouvez joindre des tables,

$query = DB::table('products') 
->join("product_attribute_materials","products.id","=","product_attribute_materials.product_id") 
->whereIn("product_attribute_materials.product_material_id", $material) 
->get(); 

OU

U peut obtenir la première identification de ce produit vient de la "product_attribute_materials" (table), puis obtenir des produits de la table des produits. comme,

$material = DB :: table("product_attribute_materials") 
->pluck('product_id') 
->whereIn("product_material_id", $material)->toArray(); 

$query->whereIn('id', $material); 

J'espère que cela aide.