Eloquentモデルのリレーションだけではできないケース

2018/10/12

Laravel でテーブル間の結合をするとき、Eloquentのリレーション(hasMany/belongTo)は大変便利です。

しかし、今回 Eloquentのリレーションだけでは上手くいかなかったケースが発生しました。

今回はその件でエントリーいたします。

 

状況

部署テーブル(depts)と従業員テーブル(employees)があったとします。

しかし、従業員テーブルの「徳川 家康」の部署IDは「4」です。

どこの部署にも所属していません。

 

問題

この場合、Eloquentモデルでリレーションをしていてもエラーになります。

  //一覧
  public function select(){
     $employees = \App\Employee::all();
  return view('employee.list')->with('employees',$employees);
  }
@foreach($employees as $employee)
  {{$employee->dept->dept_name." ".$employee->name}}<br>
@endforeach

 
実行結果

 

解決策

この場合、クエリーメソッドのJoin句を使います。

(※Eloquentモデルを使ったリレーションはしません)

  // 一覧
  public function select(){
  // $employees = \App\Employee::all();
  $employees = \App\Employee::select()
         ->join('depts','depts.dept_id','=','employees.dept_id')
         ->get();
         return view('employee.list')->with('employees',$employees);
  }
@foreach($employees as $employee)
  {{$employee->dept->dept_name." ".$employee->name}}<br>
@endforeach
部署テーブルの名前は

$employee->dept_name

でも抽出できます。

恐らく、内部結合か外部結合か指定してあげないといけないのだと思います。

 

検証

逆に「部署」テーブルに誰も所属していない部署を追加したらどうなるか?

  public function select(){
  $employees = \App\Employee::all();
    return view('employee.list')->with('employees',$employees);
  }
@foreach($employees as $employee)
  {{$employee->dept->dept_name." ".$employee->name}}<br>
@endforeach

 
実行結果

エラーにならず表示されました。

リレーション先のテーブル(deptsテーブル)に関してはマッチしないカラムがあっても大丈夫みたいです。

Eloquentのリレーションについての検証は以上です。

本庄マサノリ

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

>> Twitter をフォローする

 

-実践知識