2016-07-19 35 views
2

對於網上商店我嘗試生成一個表,看起來像:

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 

沒有爲每個類別表,每個類別都有他自己的大小(表2沒有大小M例如)。 這些表格顯示每個類別中每個產品的每個尺寸的已訂購產品數量。

在應用程序中有一個模型OrderProducts這是訂購產品在每個訂單

一種OrderProduct具有ProductSize這是產品的結表大小

ProductSize具有尺寸(其中包含尺寸的名稱)

第一step im試着做的是得到每個類別的所有尺寸/產品,例如:

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

當我運行我的代碼,我得到以下錯誤:

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

爲什麼我收到這個錯誤,我應該怎麼解決呢?

回答

5

這是因爲您的Category類已執行__get()__set()magic methods

所以線7($cat->thesizes= array();)調用Category::__set()和線12(array_push($cat->thesizes,$product->productSize);)調用Category::__get()但不Category::__set()。因此,當您將此值推向您在類別上設置的數組時,它將不起作用,因爲array_push()正在處理返回值,而不是存儲在類別中的實際數組。

有幾種方法可以解決這個問題。最快捷的辦法就是改變Category::__get()引用,這是通過使用函數的返回聲明

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

一個排序的類型提示完成但是這可能是不推薦的原因,我可以進入到返回值如果你好奇。

更明智的做法,沒有至少顯著修改代碼,是循環的範圍和內建立陣列,然後將它們添加到您的Category對象

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

如果你想要去對於加分,因爲這是Laravel以及返回值是collections,您可以爲更復雜的實施

$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

嘿做這樣的事,我知道你已經accepte這個,但我注意到了[laravel]標籤,所以我更新了我的集合示例。 –

+0

我也想出了你發佈的更明智的方式,感謝我不知道有關魔術方法的完美情況,我想我不得不做一些關於它們的研究,因爲我不明白它們如何/何時被使用在這一刻。至於收藏的例子,我認爲這個明智的例子更具可讀性。感謝您解釋良好的幫助。 –

相關問題