Laravel学習帳

Laravel5.2の学習帳です。開発環境はXAMPP for Windows 5.6.19 / 本番環境はさくらサーバー(スタンダード)

実践知識

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

2017/11/16

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のリレーションについての検証は以上です。

 

-実践知識