結合してカラム名が被ってしまったケース

2018/10/12

テーブルを結合するとよくカラム名が被ったりします。

特によく多いのが「id」や「name」です。

今回は、テーブル間を結合した際にカラム名が被ってしまったケースについてエントリーいたします。

 

状況

データーベース

部署テーブル:depts
従業員テーブル:employees

【 ポイント 】
両テーブルにあるカラム「id」と「name」が被っています。
この状態で結合するとどっちの「id」「name」なのか判別できなくなります。

 

やりたいこと

部署IDでテーブル間を結合。従業員IDと従業員の名前を表示したい。

 

問題

public function select(){
  $employees = \DB::table('employees')
  ->select()
  ->leftJoin('depts', 'employees.dept_id', '=', 'depts.id')
  ->get();
  return view('employee.list')->with('employees',$employees);
}
<h3>従業員リスト</h3>
@foreach($employees as $employee)
  {{$employee->id." ".$employee->name}}<br>
@endforeach

 
実行結果

部署IDと部署名が表示されてしまいました。

リレーション先のテーブル(depts)のカラムに上書きされているみたいです。

 

解決策

SQLの as句 を使います。

MySQLではSELECT文を使ってデータを取得する時、カラム名に対して別名を付けることができます。

【 構文 】
SELECT {カラム名} AS {変更するカラム名} FROM {テーブル名};

Laravelで記述するならselectメソッド内に記述します。

  public function select(){
  $employees = \DB::table('employees')
  ->select('employees.id as employee_id','employees.name as employee_name')
  ->leftJoin('depts', 'employees.dept_id', '=', 'depts.id')
  ->get();
<h3>従業員リスト</h3>
@foreach($employees as $employee)
  {{$employee->employee_id." ".$employee->employee_name}}<br>
@endforeach

 
実行結果

結合したときににカラム名が被ってしまったケースに関しては以上になります。

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-実践知識