ホーム > カテゴリ > PHP・Laravel・CakePHP >

LaravelでINNER JOIN / LEFT JOIN [クエリビルダ/Eloquent]

DBクラス(クエリビルダ)とEloquent ORMでのINNER JOIN及びLEFT JOINの例です。生SQLに近い状態でSQLを構築できます。

前提(テーブル)

questions質問テーブル
answers回答テーブル

マイグレーションファイルはGitHubにあります。

この記事は基本的にコードの例なので、詳細は各自で調整して下さい。

1. DBクラス(クエリビルダ)

// INNER JOIN
$items = DB::table('questions')
           ->join('answers', 'questions.id', '=', 'answers.question_id')
           ->select('questions.id','title')
           ->get();

// LEFT JOIN
$items = DB::table('answers')
           ->leftJoin('questions', 'answers.question_id', '=', 'questions.id')
           ->select('answers.id','title')
           ->get(); 

2. Eloquent ORM

Question、Answerのモデル。

// INNER JOIN
$items = Question::Join('answers', 'questions.id', '=', 'answers.question_id')
           ->select('questions.id','title')
           ->get();

// LEFT JOIN           
$items = Answer::leftJoin('questions', 'answers.question_id', '=', 'questions.id')
           ->select('answers.id','title')
           ->get();

3. (おまけ)hasOne/hasMany/belongsTo

3つとも似た操作なので、ここではhasManyの例です。

$items = Question::orderBy('updated_at','DESC')->get();
foreach ($items as $item){
  $msg = ' => 投稿者名( ';
  $answers = $item->hasMany('App\Answer')->get();
  foreach ($answers as $answer){
    $msg  = $msg  . $answer->name . ' ';
  } 
  $msg = $item->title . $msg .  ')';         
  dump($msg);
}

これらの3つを使う場合は「N+1クエリ問題」や「低速・高メモリ・高負荷」なので、公式のEagerロード(with)を参考にして下さい。

参考文献

Laravel 6.x データベース:クエリビルダ (公式)
Laravel 6.x Eloquent:リレーション (公式)
Laravel 6.x Eloquent:利用の開始 (公式)





関連記事



公開日:2020年11月16日 最終更新日:2020年11月18日
記事NO:02852


この記事を書いた人

💻 ITスキル・経験
サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。

画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ
プチモンテ代表、アーティスト名:プチモンテ
🎵 音楽制作
BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は叙情詩、叙情的な楽曲が多い。楽曲制作は2023年12月中旬 ~

オリジナル曲を始めました✨

YouTubeで各楽曲を公開しています🌈
https://www.youtube.com/@petitmonte

【男性ボーカル】DA・KA・RA | 新たな明日が風と共に訪れる

【男性、女性ボーカル】時空を超越する先に | 時空と風の交響曲

【女性、男性ボーカル】絆 | 穏やかな心に奏でる旋律