2016-08-19 6 views
3

免責事項:私は一般的にSQLの初心者です。Laravel - 関係を使用してこのSQLクエリを書き換える

多対多の関係を持つ2つのテーブルがあるため、ピボットテーブルを作成しました。

テーブルは以下の通りです:スタイル、およびsheet_style

  • Sheetモデルは私のStyleモデルは、私は現在、1の要求を記述しようとしているsheets()方法(BelongsToMany関係)

を持ってstyles()方法(BelongsToMany関係)

  • を持っていますのスタイルの名前を指定すると、対応するシートが検索されます。

    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 []; 
    } 
    

    しかし、これは本当に"最適化されていない" と思われる:ここ

    は私が思いついたものです。どこでもforeachのループを作成することなく、MySQLでのみこれを達成する方法はありますか?あるいは、私が設定した関係を使う方法がありますか?

  • 答えて

    1

    私は完全に誤解していない限り、あなたの関係が適切に設定されている場合は、あなただけの2ラインにこのすべてをダウンさせることができます。

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

    は、シートを見つけるために、二回のループの必要は全くありません - それはまさに関係は何のためです! :)

    +0

    ntroller、私はうそはなかった: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私は合計初心者と言ったとき

    use App/Style 
    
    protected function getSheetsFromStyle($style_name,Style $style) { 
        $getStyles = $style->with('Sheet')->where('name', $style_name) 
             ->get(); 
        dd($getStyles); 
    } 
    
    関連する問題