2017-05-16 1 views
0

이 문제를 검색하려고했지만 올바르게 단어를 어떻게 발음해야할지 모르겠다. 그래서 3 개의 테이블이 있습니다. 'breeds', 'breed_features'및 피봇 테이블 'breed_breed_feature' breed_features를 선택한 모든 품종을 얻으려고합니다. 배열의 from에서 from 컨트롤러로 breed_feature id-s를 전달 중입니다. 내 관계가 올바르게 설정되어 있으므로 모든 $ breed-> 기능 및 모든 $ 기능 -> 품종을 얻을 수 있습니다.Laravel 5.4 many to many 관계 쿼리

나는 시도하는 것 :

$featureids = request('features'); 

$breeds = Breed::with('features')->whereHas('features', function($q) use ($featureids) 
{ 
    $q->whereIn('breed_feature_id', $featureids); 
})->get(); 
dd($breeds); 

결과가이어야 1 기능이있는 모든 품종 ID-의

$featureids = request('features'); 

$breeds = Breed::with('features')->whereHas('features', function($q) use ($featureids) 
{ 
    $q->where('breed_feature_id', $featureids); 
})->get(); 
dd($breeds); 

결과가 배열에서 첫 번째 ID로 기능이있는 모든 품종을 반환 , 쿼리는 심지어 ID의 나머지 부분을 전달하려고하지 않습니다. 나는 1 개 이상을 통과하면

$featureids = request('features'); 

$breeds = Breed::with('features')->whereHas('features', function($q) use ($featureids) 
{ 
    foreach ($featureids as $f) 
    { 
     $q->where('breed_feature_id', $f); 
    } 
})->get(); 
dd($breeds); 

결과 반환 올바른 품종 난 단지 한 ID를 전달하면 항상 빈 컬렉션을 반환, 쿼리합니다.

도와주세요.

+0

'breed_feature_id'가 1, 2, 3, 4로 설정된 품종을 검색하려고하기 때문에 옵션 3이 비어 있습니다. 1 개 이상을 넘긴다면 각 품종에는 1 개의'breed_feature_id' 만 있습니다. 약 1 년 전에 비슷한 문제가 발생하여'whereHas'를 세 번 사용하거나'reject'를 사용하여 해결할 수있었습니다. – DestinatioN

답변

0

좋아,이 문제를 해결하기 위해 완전히 다른 방법을 사용했습니다. 그것은 작동하지만, 나는 그것을 할 수있는 더 좋은 방법이 있어야한다는 것을 확신합니다.

$features = BreedFeature::findMany(request('features')); 
    $breeds = Breed::with('features')->wherehas('features')->get(); 
    foreach($features as $f) 
    { 
     $breeds = $breeds->intersect($f->breeds); 
    } 

그래서 데이터베이스에서 모든 기능을 ID-s 형식으로 가져옵니다. 그런 다음 데이터베이스에서 모든 품종을 가져옵니다. 그러면 $ breeds 콜렉션과 $ feature-> breeds를 교차시킵니다. 더 테스트 할 예정이지만 지금은 제대로 작동하는 것 같습니다.