2021/12/14
Laravel に限らず WEB の開発ではよくテーブル間を結合してレコードを出力します。
Laravel ではクエリビルダーの JOIN メソッドを使います。
ほとんどは内部結合を利用すると思うのですが、外部結合についてもきちんと理解しておく必要はあります。
いざ大規模なサービスを扱うとなると、このあたりを知っておかないと適切な条件を書けないことになるからです。
今回は外部結合と内部結合についてのエントリーです。
結合について
WEBの開発においてAテーブルとBテーブルを合体させて検索して表示させることはよくあります。
これを結合と呼びます。
結合には内部結合と外部結合があります。
内部結合と外部結合
例)部署テーブル(depts)と従業員テーブル(employees)
テーブルの構造
各テーブルのレコード
従業員テーブルのレコードで一番下に「徳川 家康」というレコードがあります。
「dept_id」が 5 でどこにも所属されていません。
注目しておいてください。
また、部署テーブルで dept_id が 4 の「人事」があります。
この部署には誰もいません。
これも注目しておいてください。
内部結合
内部結合の命令では INNER JOIN 句を使います。
select * from テーブルA INNER JOIN テーブルB ON { 結合の条件 }
これを例にある部署テーブルと従業員テーブルを内部結合してみます。
SELECT * FROM depts INNER JOIN employees ON depts.dept_id = employees.dept_id
上記のコマンドを実行すると以下のように結果が出力されます。
従業員テーブルに「徳川家康」があったのですが消えてしまいました。
また部署テーブルの「人事」も消えています。
内部結合の場合、条件(depts.dept_id = employees.dept_id)にマッチしない場合は削除されるのです。
外部結合
内部結合では左右それぞれのテーブルの指定したカラムの値が一致するレコードだけを取得しました。
外部結合は左右それぞれのテーブルの指定したカラムの値が一致するレコードに加えてどちらかのテーブルにしか存在しないデータについても取得します。
外部結合では LEFT OUTER JOIN と RIGHT OUTER JOIN があります。
RIGHT OUTER JOIN:右側のテーブルを軸にして外部結合を行う方法
LEFT OUTER JOINでの外部結合の構文は以下です。
SELECT * FROM テーブルA LEFT OUTER JOIN テーブルB ON { 結合の条件 }
RIGHT OUTER JOINでの外部結合の構文は以下です。
SELECT * FROM テーブルA RIGHT OUTER JOIN テーブルB ON { 結合の条件 }
例にある部署テーブルと従業員テーブルをLEFTの外部結合をしてみます。
SELECT * FROM employees LEFT OUTER JOIN depts ON employees.dept_id = depts.dept_id;
LEFT OUTER JOINでは左のテーブルを基準にしましょうという意味でした。
この場合 employees テーブルが基準となります。
1)employees テーブルから全てのレコードを取得
2)employees テーブルの dept_id が depts テーブルの dept_id と合致するものを depts テーブルから取得
3)2)を1)で取得したテーブルに結合
出力結果は以下です。
内部結合で消されていた「徳川家康」が外部結合では表示されるようになりました。
次にRIGHTの外部結合をしてみます。
SELECT * FROM employees RIGHT OUTER JOIN depts ON employees.dept_id = depts.dept_id;
出力結果は以下です。
今度はずっと表示されていなかった部署テーブルの「人事」が表示されるようになりました。
RIGHT OUTER JOIN では右側のテーブル(depts)が基準となります。
そのため、部署テーブル(depts)のレコードは全て表示されるのです。
チュートリアル
Laravelのクエリービルダーを使って内部結合・外部結合をやってみます。
結合するテーブルについて
手順
1)コントローラの作成
2)ビューの作成
3)ルーティングの設定
4)動作確認
1)コントローラの作成
内部結合と外部結合(LEFT JOIN、RIGHT JOIN)を作っておきます。
まずは内部結合から表示させます。
: public function select(){ // INNAR JOIN $employees = \DB::table('employees') ->join('depts','employees.dept_id','=','depts.dept_id') ->get(); // LEFT OUTER JOIN // $employees = \DB::table('employees') // ->leftJoin('depts','employees.dept_id','=','depts.dept_id') // ->get(); // RIGHT OUTER JOIN // $employees = \DB::table('employees') // ->rightJoin('depts','employees.dept_id','=','depts.dept_id') // ->get(); :
LEFT JOIN, RIGHT JOINは、LEFT OUTER JOIN, RIGHT OUTER JOINの省略系です。
2)ビューの作成
<h3>内部結合・外部結合のテスト</h3> <p style="color: tomato;">※INNER JOIN</p> @foreach($employees as $employee) {{$employee->dept_name." ".$employee->name}}<br> @endforeach
3)ルーティングの設定
Route::get('employee/list','EmployeeController@select');
4)動作確認
ブラウザで確認します。
コントローラで記述したコメントアウトを外していって順に確認していきます。
内部結合
外部結合(LEFT JOIN)
※「徳川家康」が表示
外部結合(RIGHT JOIN)
※「人事」が表示
内部結合・外部結合に関しては以上です。
Udemyを使ったLaravel学習方法
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。