2016-07-19 5 views
2

Für einen Webshop im einen Tisch zu erzeugen versuchen, die wie folgt aussieht:

Tablename: category 1 
productname  S M L X total 
name1   1 0 1 3 5 
name2   0 1 0 2 3 


Tablename: category 2 
productname  S L X total 
name5   1 1 3 5 
name8   0 0 2 2 

Es gibt eine Tabelle für jede Kategorie ist, hat jede Kategorie sein eigene Größen (Tabelle 2 hat zB keine Größe M). Die Tabellen zeigen die Anzahl der bestellten Produkte pro Größe pro Produkt in jeder Kategorie an.

In der Anwendung gibt es ein Modell OrderProducts die Produkte in jedem Auftrag bestellt werden.

Ein OrderProduct hat eine ProductSize die eine Verknüpfungstabelle des Produkts

A ProductSize eine Größe hat Größen (die den Namen der Größe enthält)

der erste Schritt im tryin zu tun ist, erhalten alle Größen/Produkte für jede Kategorie wie:

$order = Order::findOrFail($id); 
    $products = OrderProduct::where('orders_id',$id)->get(); 

    $categories = Category::all(); 
    //get sizes and products per category 
    foreach($categories as $cat) 
    { 
     $cat->thesizes= array(); 
     $cat->theprodcts= array(); 
     foreach($products as $product) 
     { 
      if($product->productSize->product->category_id == $cat->id) 
      { 
       array_push($cat->thesizes,$product->productSize); 
       array_push($cat->theprodcts,$product); 
      } 

     } 
     //make sure all values are unique (no dubbele sizes). 
     $cat->theSizes = array_unique($cat->theSizes); 
     $cat->theProducts = array_unique($cat->theProducts); 
    } 

Wenn ich meinen Code ausführen ich die folgende Fehlermeldung erhalten:

Indirect modification of overloaded property App\Category::$thesizes has no effect

Warum muss ich diesen Fehler und wie soll ich es lösen?

Antwort

5

Dies ist weil Ihre Category Klasse die __get() und __set()magic methods implementiert hat.

So Linie 7 ($cat->thesizes= array();) ruft Category::__set() und Linie 12 (array_push($cat->thesizes,$product->productSize);) ruft Category::__get()aber nichtCategory::__set(). Während Sie dies also mit der Absicht durchführten, Werte auf ein Array zu schieben, das Sie in der Kategorie festlegen, funktioniert es nicht, da array_push() an einem Rückgabewert arbeitet und nicht am tatsächlichen in der Kategorie gespeicherten Array.

Es gibt einige Möglichkeiten, dies zu beheben. Die Verknüpfung Weg ist Category::__get() zu ändern, indem Bezug auf die Rückgabewerte, die unter Verwendung einer Art-Typ-Hinweis auf die Funktion der Rückkehr Erklärung

class Category 
{ 
    public function &__get($key) { 
     // body of function 
    } 
} 

Aber das ist wahrscheinlich nicht zu empfehlen aus Gründen geschieht ich gehen kann in wenn du neugierig bist.

Je vernünftiger Ansatz, ohne den Code zumindest deutlich zu modifizieren, ist die Arrays im Rahmen der Schleife zu bauen und dann sie

foreach ($categories as $cat) { 
    // Scope local arrays here first 
    $thesizes = array(); 
    $theproducts = array(); 

    foreach ($products as $product) { 
     if ($product->productSize->product->category_id == $cat->id) { 
      // Push to those local arrays 
      array_push($thesizes, $product->productSize); 
      array_push($theprodcts, $product); 
     } 
    } 

    // Now assign them to the category object 
    $cat->theSizes = array_unique($thesizes); 
    $cat->theProducts = array_unique($theproducts); 
} 

zu Ihren Category Objekten hinzufügen Wenn Sie hinwollen da diese Laravel und Ihre Rückgabewerte für Bonuspunkte, sind collections ist, können Sie so etwas wie dies für eine anspruchsvollere Umsetzung

$categories = (Category::all())->map(function(Category $cat) { 
    $cat->theProducts = $products 
     ->filter(function(Product $product) use ($cat) { 
      return $product->productSize->product->category_id == $cat->id; 
     }) 
     ->unique(); 

    $cat->theSizes = $cat->theProducts 
     ->map(function(Product $product) { 
      return $product->productSize(); 
     })->unique(); 
}); 
+0

Hey tun, merke ich Sie schon accepte d dies aber ich notierte das [laravel] -Tag, also habe ich mein darauf basierendes Kollektions-Beispiel aktualisiert. –

+0

Ich kam auch auf die vernünftigere Weise, die du gepostet hast, danke für die Erläuterung, die ich über die magischen Methoden nicht wusste, ich denke, dass ich etwas studieren muss, sobald ich nicht verstehe, wie/wann sie benutzt werden im Augenblick. Was das Sammlungsbeispiel betrifft, so denke ich, dass das sinnvolle Beispiel besser lesbar ist. Danke für deine gut erklärte Hilfe. –

Verwandte Themen