2018/10/12
テーブルを結合するとよくカラム名が被ったりします。
特によく多いのが「id」や「name」です。
今回は、テーブル間を結合した際にカラム名が被ってしまったケースについてエントリーいたします。
状況
データーベース
部署テーブル:depts
従業員テーブル:employees
【 ポイント 】
両テーブルにあるカラム「id」と「name」が被っています。
この状態で結合するとどっちの「id」「name」なのか判別できなくなります。
両テーブルにあるカラム「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 {テーブル名};
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 を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。