2014-09-02 5 views
0

세 가지 모델 : 상점, 제품 및 태그가 있습니다. 상점과 제품은 일대 다 관계에 있고, 제품은 태그가 많고 많게는 많습니다.Laravel Eloquent ORM - 다른 객체를 통해 객체를 반환합니다.

많은 제품에 동일한 태그가있을 수 있기 때문에 각 모든 고유 태그를 쇼핑하고 싶습니다.

class Shop extends Eloquent { 

    public function products() { 
     return $this->hasMany('Product'); 
    } 
} 


class Product extends Eloquent { 

    public function shop() { 
     return $this->belongsTo('Shop'); 
    } 

    public function tags() { 
     return $this->belongsToMany('Tag'); 
    } 
} 

class Tag extends Eloquent { 

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

내가 제안한 해결책 중 하나는 다음과 같습니다. 문제는 고유 태그를 얻지 못한다는 것입니다. 태그 배열을 통과하고 태그 객체의 id를 비교하기 위해 다른 foreach 루프를 두는 해결책이 있습니다. 조금 더 최적화하고 싶습니다. 어떻게하면 좋고/깨끗한 해결책이라고 생각합니까?

class Shop extends Eloquent { 

    ... 

    public function getTagsAttribute() { 
     $tags = array(); 
     foreach($this->products as $product) 
     { 
      foreach ($product->tags as $tag) 
      { 
       $tags[] = $tag; 
      } 
     } 

     return $tags; 
    } 
} 

답변

1

을 늑대 인간의 방법은 당신을 위해 작동 할 것입니다, 그러나 모든 관계를 위해 작동 할 트릭이 여기 있습니다 :

$shop = Shop::with(['products.tags' => function ($q) use (&$tags) { 
    $tags = $q->get()->unique(); 
}])->find($someId); 

// then: 
$tags; // collection of unique tags related to your shop through the products 

$tagsbelongsToMany 관계이기 때문에 pivot 속성을 가지지 만 분명히 의존하지는 않습니다.

+0

더 나은 해결책 –

+0

예, 주목할 가치가 있습니다. 태그를 가져 오기 위해 추가 쿼리를 실행합니다. 그것은 단점이지만 여전히 필요한 것을 얻기위한 가장 쉬운 해결책입니다. –

1

아마 당신이 시도 할 수 있습니다 :

$tags = Tag::has('products')->get(); 

이 어떤 Product에 바인딩 된 모든 Tags를 반환합니다. 필요한 경우, 당신은 또한이 같은 distinct을 사용할 수 있지만, 나는이 경우에는 필요하지 생각 :

$tags = Tag::has('products')->distinct()->get(); 

이 업데이트 : 그런 다음이 같은 시도 할 수 있습니다 : @

public function getTagsAttribute() 
{ 
    $shopId = $this->id; 

    $tags = Tag::whereHas('products', function($query) use($shopId) { 
     $query->where('products.shop_id', $shopId); 
    })->get(); 

    return $tags; 
} 
+0

특정 상점에 속한 고유 한 태그를 얻으려고합니다. –

+0

사이에 모델이 있습니다. 업데이트 된 답변을 확인하십시오. –

+0

큰 일, 고마워. 이것은 내가 찾고 있었던 것입니다 –