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 を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。