2017-11-04 3 views
0

I abzurufen haben folgende DB-Struktur:Aufbau einer Abfrage Farben verfügbar Produkt

products: id, product_id, name, desc, etc... 
categories: id, name, slug 
product_category: product_id, category_id 
product_colors: product_id, color_id 
product_sizes: product_id, size_id 
colors: id, value, hex 
sizes: id, value 

Ich habe auch die Strecke:/Kategorie/{Slug}, wo ein Benutzer alle Produkte, die unter einer Kategorie sieht, mit einem Sidebar zum Filtern nach Preis und anderen Kategorien. Was ist der beste Weg, um alle Produktfarben speziell die Produkte, die unter einer Kategorie geladen wurden, bestimmte Werte auch, so dass es keine doppelten Farben werden.

Abfrage Produkte abzurufen:

Product::whereHas('categories', function ($q) use ($cat_ids) { 
     return $q->whereIn('id', $cat_ids); 
    })->with(['colors', 'sizes', 'brand'])->get(); 

EDIT: Abrufen von Farben und Größen:

$sizes = collect($products->pluck('sizes'))->flatten()->pluck('value', 'id'); 
$colors = collect($products->pluck('colors'))->flatten()->pluck('value', 'id'); 

product.php:

public function categories() { 
    return $this->belongsToMany(Category::class, 'product_category'); 
} 

public function colors() { 
    return $this->belongsToMany(Color::class, 'product_colors'); 
} 

public function sizes() { 
    return $this->belongsToMany(Size::class, 'product_sizes'); 
} 

category.php

public function products() { 
    return $this->belongsToMany(Product::class, 'product_category'); 
} 

Color.php

public function products() { 
    return $this->belongsToMany(Product::class, 'product_colors'); 
} 

Size.php

public function products() { 
    return $this->belongsToMany(Product::class, 'product_sizes'); 
} 
+0

Datenbank Namenskonvention: gute Praxis, wenn Sie Ihren Tabellennamen wie category_product ändern (IN ALPHABETICAL ORDER). –

Antwort

0

Hier ist eine nicht-Kollektion orientierte Methode: Schleife durch die Produkte in einer Kategorie, den Aufruf der Farbfunktion. Fügen Sie jedes Ergebnis zu einem Array hinzu. Wenn Sie fertig sind, entfernen Sie die Duplikate.

Dies wird erreichen, was Sie gefragt haben, aber wenn Sie möchten, dass die Originalprodukte noch an die Farben angehängt werden (im Grunde eine andere zurückgegebene Datenstruktur), müssen Sie angeben, wie es aussehen soll.

+0

Ich habe meine Frage bearbeitet mit was ich denke, ist die Antwort für das, was ich brauche, ich habe 2 separate Tabellen für Farben und Größen erstellt, und jetzt verbinden sie beide mit Produkten, was denkst du? –

0

in Ihrer Kategorie, Sie unter der Annahme, haben viele Produkte unter einer Kategorie

ändern Sie bitte Ihre category.php

public function products() 
{ 
    return $this->belongsToMany(Product::class, 'product_category'); 
} 

Holen Sie sich die Basis Sammlung wie diese

$categories = Categories::with('products')->all(); 
(mehr Sinn machen)

Dann haben Sie alle Kategorien mit Produkten

Dann Sie wird eine verschachtelte Sammlung haben

collection => 
    1 => Category [ // category collection 
     products => collection() => [ // the products colection 
       colors => collection() // colors collection 
      ] 
     ] 

Sie können auf ein Produkt mit einer normalen foreach-Schleife zugreifen.

foreach($categories as $category) 
{ 

    // since you already have the relationship setup. you can call the 
    // relationship easily like this. 
    foreach($category->products as $product) 
    { 

     // products model 
     foreach($product->colors as $color) 
     { 
      // your colors model. 
     } 

    } 
} 
+0

Ich habe meine Frage bearbeitet mit was ich denke, ist die Antwort für das, was ich brauche, ich habe 2 separate Tabellen für Farben und Größen erstellt, und jetzt verbinden sie beide mit Produkten, was denkst du? –

+0

Was brauchen Sie? Ich meine eine Produktkollektion mit Kategorien? Apropos deine Antwort.Es ist gut, aber ich denke du machst es kompliziert. Von was ich verstehe, brauchen Sie das richtig? Kategorie-> Produkt-> Farbe? Recht ? – Sithira

+0

Ja, Kategorien * -> Produkte-> Farben, Sie können Produkte nach mehreren Kategorien filtern, dann, sobald die Produkte abgerufen werden, verwende ich die Flatten und Rupfen-Methoden, um alle Farben und Größen zu erhalten. Was ist kompliziert an dem, was ich genau gemacht habe? –

Verwandte Themen