2020/08/12
前回Eloquentのリレーション(hasMany/belongTo)を使ってテーブルを結合しました。
今回はクエリービルダーのJOIN句を使って結合してみます。
クエリービルダー
テーブル間の結合を JOIN してデータを取得したい時は、クエリービルダーを使います。
例)部署(dept)と従業員テーブル(employees)の結合
Eloquent & クエリービルダー
$employees = App\Employee::select() -> join('depts','depts.dept_id','=','employees.dept_id') -> get();
DBファサード & クエリービルダー
$employees = \DB::table('employees') ->join('depts','employees.dept_id','=','depts.dept_id') ->get();
join句を使って結合すると、テーブル間でカラムが被る場合があります。
この場合selectメソッドを使い、SQLのas句を使います。
例)部署テーブルの名前が「name」で従業員テーブルの「name」カラムと被ってしまった場合
$employees = \DB::table('employees') ->select('name', 'depts.name as dept_name') ->join('depts','employees.dept_id','=','depts.dept_id') ->get();
チュートリアル
「部署」テーブルと「従業員」テーブルをJOIN句を使って結合します。
前回、作成したチュートリアルを編集します。
手順
1)コントローラの修正
2)ビューの修正
3)動作確認
1)コントローラの修正
: use DB; : //一覧 public function select(){ $employees = DB::table('employees') ->join('depts','employees.dept_id','=','depts.dept_id') ->get(); return view('employee.list')->with('employees',$employees); } :
2)ビューの修正
<h3>従業員リスト</h3> <p style="color: tomato;">※クエリービルダーのJOIN句で表示</p> @foreach($employees as $employee) {{$employee->dept_name." ".$employee->name}}<br> @endforeach
※リレーション先のカラムの表示の仕方は hasMany/belongTo のやり方と違います。
◆ hasMany/belongTo
$employee->dept->dept_name
◆ クエリービルダーJoin句
$employee->dept_name
でOKです。
3)動作確認
クエリービルダーによるJOIN句の結合については以上です。
PHPフレームワーク Laravel入門 第2版
僕がはじめてLaravelを学習するために参考にしたサイトは、掌田津耶乃(しょうだつやの)さんの libro というサイトです。当時(2016年)、Laravel学習サイトの中でもこのサイトは群を抜いてわかりやすく説明されていたので、とても勉強になったのを覚えています。この本は掌田津耶乃さんが書いた本なので、わかりやすく解説されているだろうと kindle で購入しました。2020年8月の時点でいうと日本国内にて唯一の Laravel の良書と言っても良いかと思います。口コミでもLaravel本のロングセラー定番解説書として認知されています。当サイトではチュートリアル形式でLaravelを解説しているので、初心者の方はこの本とセットで学習されるといいと思います。しかし、かなりわかりやすく解説されているとはいえ、PHP中級者以上のスキルは必要です。PHP自体の知識が乏しい方は 独習PHP 第3版 をあわせて購入することをお勧めします。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。