2017-01-19 19 views
0

我有一個表與測試日期(測試)和一個表與每個測試日期(結果)的結果表。 我首先獲取特定運動員/客戶的所有測試記錄。 然後我需要獲得每個測試記錄的所有結果。 我只是設法讓它與foreach循環一起工作。 1.是否有更優化的方式來構建查詢? 2.對於刀片服務器,它可能更具有結構化,使陣列按照test_id排序?在刀片中,我將測試數據顯示爲標題以及下面每個標題的結果。Laravel 5.3其中從現有集合 - 優化

下面的第一個選項與子查詢不起作用。獲取未找到數據庫表錯誤:

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

這一件作品 - 必須進行優化:

$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

http://stackoverflow.com/questions/40458146/l aravel-5-3-which-returns-unique-result幫助了,但是如果沒有第一個,我無法得到第二個集合。 – louisav

回答

2

如果你正確地定義你的模型之間的關係,你就可以得到一個結果更簡單和更有效的方式。

首先,定義關係:

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

現在,你就可以獲取測試和他們與給定運動員模式的結果:

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

您現在可以訪問結果對於給定的測試:

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

我的模特如上設置。這工作很好,很容易和高效。現在我的控制器功能代碼中有80%被'$ athlete_tests = $ an_athlete-> tests() - >替換爲('results') - > get();'Blade部分現在也得到了改進。謝謝 – louisav