ホーム > カテゴリ > 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