2017-09-16 3 views
0

Laravel 5.5에 범주 및 제품이 있습니다 각 제품에는 카테고리가 있으며 카테고리에는 상위 카테고리가있을 수 있습니다. 나는 그것이 보여 질 때 카테고리의 모든 아이들의 제품을 얻고 싶다. 예 : 의류는 cateogry이며 셔츠, 자켓 등과 같은 하위 카테고리가 있으며 의류 카테고리에서 클릭하면 셔츠 또는 재킷 카테고리가있는 모든 제품을 표시하려고합니다. 나는 "cloth1", "cloth2"와 "셔츠 1"세 가지 제품을 내 경우Laravel 관계가 두 번 항목을 반환합니다

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"와 "셔츠 1") 모든 제품을 게재하려는 그러나보기에

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

반환 "cloth1", "cloth2" "shirt1", "shirt1"(셔츠를 두 번 돌려줍니다). 어떤 아이디어가 왜, 어떻게 고쳐야할까요?

편집 : 나는 "cloth1"와 "cloth2"나는 셔츠 카테고리에 그것을 시도 할 때 (어떻게해야되는) 한 번만 "셔츠 1"을 반환

를 반환하는 의류 카테고리에 $category->products을하려고 할 때 함수가 지금과 같은
+0

'$ this-> products'와'$ this-> children'에'()'이 누락 된 오타가 있습니까? –

+0

아니요. laravel 관계가 그런 식으로 작동한다는 것을 알고있는 한, 대괄호는 함수가 관계를 반환하지 않을 때만 필요합니다. – TheAngelM97

+0

자, 이제는'$ products'에 이미 배열이 포함되어 있기 때문에'$ products []'루프에 같은 값을 다시 추가하는 것만으로 반환 배열의 이름을 다른 것으로 바꿀 수 있습니다. 루프에서'dd()'를 시도하여 그 일을 확인하십시오. –

답변

0

은 내가 contains() 방법을 사용하여 내 문제를 해결 : 내가 사용하지 않는 두 번 경우는 "셔츠 1"을 반환하는 이유

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