2017-01-19 8 views
0

私は、テスト日付(テスト)と各テスト結果(結果)の結果を含むテーブルを持つテーブルを持っています。 まず、特定のアスリート/顧客のすべてのテスト記録を取得します。 次に、これらのテストレコードごとにすべての結果を取得する必要があります。 私はそれをforeachループで動作させることしかできません。 1.クエリを構造化する最適な方法はありますか? 2.ブレードの場合、test_idごとに配列が配列されるように構造化されていますか?ブレードでは、テストデータをヘッダーとして表示し、それぞれの結果を下に表示します。Laravel 5.3 whereInから既存のコレクション - 最適化

サブクエリを使用した以下の最初のオプションは機能しません。 dbテーブルが見つからないエラーを取得:

$athlete_tests = Test::where('athlete_id', $an_athlete->id)->get(); 
    if($athlete_tests){ 
     $results = Result::whereIn('test_id', function($query) use ($an_athlete){ 
        $query->select('test_id') 
         ->from('Test') 
         ->where('athlete_id', $an_athlete->id); 
       })->get(); 
    }     

この1作品 - 最適化されている必要があります

$athlete_tests = Test::where('athlete_id', $an_athlete->id)->get(); 
    if($athlete_tests){ 
     $results = collect([]); 

     foreach ($athlete_tests as $key => $value) { 
      $results = $results->merge(Result::where('test_id', $value->id)->get()); 
     }      
    } 
+0

3 http://tackoverflow.com/questions/40458146/l aravel-5-3-whom-returns-unique-resultが助けられましたが、私は最初のコレクションなしで2番目のコレクションを手に入れることはできません。 – louisav

答えて

2

あなたが正しくあなたのモデル間の関係を定義する場合、あなたはAで結果を取得することができますはるかに簡単で効率的な方法です。

まず、関係定義:あなたは今の結果にアクセスすることができます

$athlete_tests = $an_athlete->tests()->with('results')->get(); 

:今

class Athlete extends Model { 
    public function tests() { 
    return $this->hasMany(Test::class); 
    } 
} 

class Test extends Model { 
    public function athlete() { 
    return $this->belongsTo(Athlete::class); 
    } 

    public function results() { 
    return $this->hasMany(Result::class); 
    } 
} 

を、あなたがテストし、与えられたアスリートモデルのための彼らの結果を取得できるようになります指定されたテストのために:

foreach ($athlete_tests as $test) { 
    $results = $test->results; 
} 
+0

私のモデルは上記のように設定されています。これは美しく機能し、とても簡単で効率的です。私のコントローラの機能コードの80%は、 '$ athlete_tests = $ an_athlete-> tests() - >(' results ') - > get();で置き換えられました。ありがとう – louisav

関連する問題