DBの操作について(Eloquent)~リレーション~

2018/12/14

DBのテーブルの結合は2つやり方があります。

・Eloquentのリレーション
・クエリービルダーの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 を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-基礎知識