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