2017-05-11 1 views
4

간단한 작업처럼 보이는 것에 붙어 있습니다.Laravel이 관계 항목 모음을 얻습니다.

나는 많은 제품이 많은 상점이있는 사용자 ..

내가 특정 사용자에 대한 모든 제품을 얻으려고합니다.

가 작동하고, 그들의 제품

\Auth::user()->shops()->with('products')->get(); 

으로 상점을 반환하지만 단지 제품의 수집이 필요합니다. 다음을 시도했지만 질의가 엉망이되었습니다.

\Auth::user()->shops()->with('products')->select('products.*')->get(); 

내가 뭘 잘못하고 있다고 생각하니? 고맙습니다! 제품 모델 점포 ID 저장했다고 가정

+1

사용할 수있는'제품 : 어디에 ('USER_ID'인증 :: ID()) -> get()'? 상점에 액세스해야합니까? – haakym

답변

-2

, 다음을 시도해보십시오 :

Products::whereIn('id_shop', 
    Shops::select('id') 
    ->where('id_owner_user',Auth::user()->id) 
    ->get()) 
->get() 

그것은 인증 된 사용자

+0

이것은 관계 나 조인을 사용하지 않습니다. 이것은 하나의 매개 변수로 실행되는 두 개의 SELECT 쿼리이므로 덜 효율적이며 OP가 요구하지 않는 것입니다. –

+0

그는 "제품 컬렉션만을 필요로합니다."라고 말했습니다. 만약 당신이 합치면 두 모델 – aaron0207

+0

BTW를 당기고 있습니다, downvoted, laravel 관계에 대한 쿼리를 생성합니다 @DanielWaters 오늘 그것에 대해 많이 읽고 두 개의 선택 쿼리 조인보다 빠릅니다.좋은 코딩 동료가 – aaron0207

0

에 속하는 상점의 목록에 속하는 제품의 컬렉션을 검색합니다 이 경우 lazy eager loading를 사용할 수 있습니다

auth()->user()->load('shops.products'); 

제품을 반복하려면

를 0
@foreach (auth()->user()->shops as $shop) 
    @foreach ($shop->products as $product) 
     {{ $product->name }} 
    @endforeach 
@endforeach 

당신은 단지 제품을해야하는 경우 : 두 경우 모두

Product::whereHas('shop', function ($q) { 
    $q->where('user_id', auth()->id()); 
})->get(); 

, 당신은 DB에 쿼리 같은 수있을 것이다, 그래서 실제 응용 프로그램에서 첫 번째 예제를 사용하십시오. 당신은 사용자 모델과 제품 모델 사이의 관계가 필요

+0

하십시오 downvote를 설명하십시오. –

+0

메신저 나는 이것을 downvoted 사람이 아니지만, OP가 상점을 사용하지 않고 제품에 액세스하는 방법을 묻고 있기 때문에 이것이라고 생각합니다. – Demonyowh

+0

나는 어느 쪽이든을 downvote하지 않았다! 나는 절대 다운 다운하지 않는다. – Notflip

7

.. 지금

hasManyThrough 관계를 이용 가능하다 ..

사용자 모델

public function products() 
{ 
    return $this->hasManyThrough('App\Product', 'App\Shop') 
} 

, 당신을 모든 사용자의 제품에 액세스 할 수 있습니다.

Auth::user()->products; 
+0

답변 해 주셔서 감사합니다. 문제는 공급자가 있고 상점이없는 사용자도있을 것입니다. 그러면 바로 충돌 할 것입니다. – Notflip

+0

귀하의 경우 .. 귀하의 제품 모델도 데이터베이스에 user_id 필드가 있어야합니다. 그런 다음 반환 '$ this-> hasMany ('App \ Product '); 하지만 이것은 모델 관계의 계층 구조를 우회하는 것처럼 좋은 습관은 아닙니다. – Demonyowh

+0

주목할 가치가 있음 -> with ('relationship')을 사용하면 그 관계가 열심히로드됩니다 –

4

당신은 이것을 사용할 수 있습니다 : 당신이 복제하지 않으려면

\Auth::user()->shops()->with('products')->get()->pluck('products')->flatten(); 

, 당신이하고 뭐가 잘못 ->unique()

+0

완벽! 완벽 해! 뽑다에 대해 몰랐다. – Notflip