2018/12/14

DBのテーブルの結合は2つやり方があります。
・クエリービルダーのJoinメソッド
今回は「Eloquentのリレーション」を使ってテーブルを結合してみます。
Eloquentのリレーション
Eloquentのリレーションでは事前にテーブル間の親子関係について考えます。
例)「部署」テーブルと「従業員」テーブルの関係について考える
この関係を Model にて表現することでEloquent による結合ができます。
実際のモデルではこのように記述します。
まずは従業員モデル
class Employee extends Model
{
//belongsTo設定
public function dept()
{
return $this->belongsTo('App\Dept');
}
}
続いて部署モデル
class Dept extends Model
{
//hasMany設定
public function employee()
{
return $this->hasMany('App\Employee');
}
}
これでModelの定義はOKです。
「employees」テーブルと「depts」テーブルが結合されます。
例えば、EloquentでEmployeeモデルを使用してみます。
Controller
//一覧
public function select(){
$employees = \App\Employee::all();
return view('employee.list')->with('employees',$employees);
}
ビューで「部署」テーブルのカラムを表示してみます。
View
@foreach($employees as $employee)
{{$employee->dept->dept_name." ".$employee->name}}<br>
@endforeach
リレーション先の「部署」テーブルのカラムの取得は
$employee->dept->dept_nameで可能です。
ブラウザで確認するとちゃんとリレーション先のカラムも表示されているのがわかります。
チュートリアル
「部署」テーブルと「従業員」テーブルを Eloquentのリレーションを使って結合します。
前回チュートリアルで作成した従業員一覧に「部署」の項目も表示させます。
先ほどは「employee」モデルの Eloquent を使用したので、チュートリアルでは「dept」モデルの Elouent を使用してみます。
テーブルの構造
「部署」テーブル(depts)
「従業員」テーブル(employees)
手順
1)モデルの修正
2)コントローラの修正
3)ビューの修正
4)動作確認
1)モデルの修正
artisanコマンドでモデルのスケルトンを作成し、中身をコーディングしていきます。
従業員モデル
class Employee extends Model
{
//timestamps利用しない
public $timestamps = false;
protected $fillable = ['dept_id','name','email'];
//belongsTo設定
public function dept()
{
return $this->belongsTo('App\Dept');
}
}
部署モデル
:
class Dept extends Model
{
//timestamps利用しない
public $timestamps = false;
protected $fillable = ['dept_name'];
//primaryKeyの変更
protected $primaryKey = "dept_id";
//hasMany設定
public function employee()
{
return $this->hasMany('App\Employee');
}
}
:
2)コントローラの修正
:
class EmployeeController extends Controller
{
//一覧
public function select(){
$employees = \App\Employee::all();
return view('employee.list')->with('employees',$employees);
}
}
:
3)ビューの修正
:
<h3>従業員リスト</h3>
<p style="color: tomato;">※Eloquentで表示</p>
@foreach($employees as $employee)
{{$employee->dept->dept_name." ".$employee->name}}<br>
@endforeach
:
4)動作確認
Eloquent によるリレーションは以上です。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。


