2017-09-16 13 views
0

Laravel 5.5のカテゴリと製品があります 各製品にはカテゴリがあり、カテゴリには親カテゴリがあります。私はカテゴリーのすべての子供の製品を見せたいと思っています。例:服は服飾品であり、シャツ、ジャケットなどのサブカテゴリがあり、衣類カテゴリでクリックすると、シャツまたはジャケットカテゴリを持つすべての商品を表示します。私は "cloth1"、 "cloth2" と "shirt1" の3つの製品を持っている私の場合はLaravel関係で2回返す

public function children() 
{ 
    return $this->hasMany('App\Category', 'parent_id'); 
} 
public function products() 
{ 
    return $this->hasMany('App\Product'); 
} 

public function getAllProducts() 
{ 
    $products = $this->products; 

    foreach ($this->children as $child) { 
     foreach ($child->products as $product) { 
      $products[] = $product; 
     } 
     } 

    return $products; 
} 

: はここに私のCategory.phpモデルです。 「cloth1」と「cloth2」は衣類カテゴリに属し、「shirt1」は服のサブカテゴリであるシャツカテゴリに属する​​。だから私は服のカテゴリページにいる時、私はすべての製品(「cloth1」、「cloth2」と「shirt1」)を表示したい しかし、ビューの

{{dd($category->getAllProducts())}} 

戻っ「cloth1」、「cloth2」、 "shirt1"、 "shirt1"(2回返します)。どのようなアイデアをなぜ、どのようにこれを修正するには?

EDIT:私は服のカテゴリに$category->productsをしようとすると、それは「cloth1」と「cloth2」を返し、私はシャツのカテゴリにそれをしようとすると、それは

(どのようにすべきである)一度だけ「shirt1」を返します関数は次のようになります
+0

'$ this-> products'と' $ this-> children'に '()'がありませんか? –

+0

いいえ、私はララベルの関係がそのように機能することを知っている限り、ブラケットは、関数が関係を返さない場合にのみ必要です。 – TheAngelM97

+0

あなたは紛らわしいので、 '$ products'にすでに配列が含まれているので、ループの' $ products [] 'に再び同じ値を追加して、おそらく戻り配列を別の名前に変更することができます。ループ中で 'dd()'を試して、何をしているのか見てみましょう。 –

答えて

0

私はメソッドを使用して私の問題を修正:私は使用していない二度ならば、それは「shirt1」を返す理由

public function getAllProducts() 
{ 
    $products = $this->products; 

    foreach ($this->children as $child) { 
     foreach ($child->products as $product) { 
      if (!$products->contains($product)) { 
       $products[] = $product; 
      } 
     } 
    } 

    return $products; 
} 

しかし、私はまだ知らないcontains