2017-05-16 21 views
0

私はこの問題を検索しようとしましたが、正しく言葉を語る方法がわかりません。 私は3つのテーブルを持っています。 'breeds'、 'breed_features'、ピボットテーブル 'breed_breed_feature' breed_featuresを選択したすべての品種を取得しようとしています。 配列からfromのfromコントローラにbreed_feature id-sを渡しています。 私の関係は正しく設定されているので、私はすべての$ breed-> features とすべての$ feature-> breedsを得ることができます。Laravel 5.4多対多関係クエリ

$featureids = request('features'); 

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

結果は、少なくとも機能の1 ID-S

$featureids = request('features'); 

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

結果は配列の最初のidを持つ機能を持っているすべての品種を返す必要があり、すべての品種である:私が試してみました何

、クエリはIDの残りの部分を渡そうとしません。

$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); 

結果は、私は照会するだけで1 IDを渡す場合、私は1以上のものを渡した場合、それは常に空のコレクションを返す正しい品種を返します。

お願いします。

+0

オプション3は、 'breed_feature_id'が1、2、3、4に設定された品種を検索しようとするため空です。 1を超えて渡すと、各品種には1つの 'breed_feature_id'しかありません。 約1年前、私は同様の問題を抱え、 'whereHas'を3回使って解決するか、' reject'を使って解決することができました。 – DestinatioN

答えて

0

[OK]を、私はこの問題を回避するために全く別の方法を行った。それは動作しますが、私はそれを行うためのより良い方法が必要であることを確信しています。

$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の交差を開始します。 さらにテストしますが、今はうまく動作しているようです。