2016-08-19 48 views
3

聲明:我是一般SQL中的絕對新手。Laravel - 使用關係重寫這個SQL查詢

我有2個表具有多對多的關係,因此我創建了一個數據透視表。

的表格如下:樣式,和sheet_style

  • Sheet模型具有styles()方法(BelongsToMany關係)
  • Style模型具有sheets()方法(BelongsToMany關係)

我目前正試圖寫一個請求,1給定風格名稱,它會檢索相應的

這裏是我想出了:

protected function getSheetsFromStyle($style_name) { 
    $style = Style::where('name', $style_name)->first(); 

    if($style != null) { 
     $entries = \DB::table('sheet_style')->where('style_id', $style->id)->get(); 

     $corresp_sheet_ids = []; 
     foreach($entries as $entry) { 
      array_push($corresp_sheet_ids, $entry->sheet_id); 
     } 

     $corresp_sheets = []; 
     foreach($corresp_sheet_ids as $s_id) { 
      array_push($corresp_sheets, Sheet::where('id', $s_id)->first()); 
     } 
     return $corresp_sheets; 
    } 
    return []; 
} 

然而,這似乎真的「未優化」。有沒有辦法在MySQL中實現這一點,而不必在任何地方創建foreach循環?或者,有沒有辦法使用我設定的關係?

回答

1

除非我誤解完全,你可以把所有這一切都下降到只有兩行,如果你的關係已正確設置:

$style = Style::where('name', $style_name)->first(); 
return $style ? $style->sheets : []; 

絕對沒有必要循環兩次找到張 - 這正是關係是什麼! :)

+0

當我說我是一個總的新手,我沒騙:P謝謝你,它的工作原理:) – Gefn

+0

我很高興它幫助。 :) –

1

如果您有興趣,爲解決這個SQL會是這樣的:)

select sh.sheet_id, sh.sheet_name from sheet sh 
join sheet_style ss on (ss.sheet_id = sh.sheet_id) 
join style st on (ss.style_id = st.style_id) 
where st.style_name = 'style_name' 
0

嘗試這個

應用/表

public function Style() 
{ 
    return $this->belongsToMany('App\Style'); 
} 

應用/風格

public function Sheet() 
{ 
    return $this->belongsToMany('App\Sheet'); 
} 

Co ntroller

use App/Style 

protected function getSheetsFromStyle($style_name,Style $style) { 
    $getStyles = $style->with('Sheet')->where('name', $style_name) 
         ->get(); 
    dd($getStyles); 
}