LaravelのhasManyThroughリレーションで仲介するテーブルを通して最終的に取得したテーブルへアクセスする方法をまとめました。
目次
① LaravelでhasManyThroughを使う(第1、2引数)
以下の3つのテーブルを例に、departmentsを経由してemployeeを取得する。
companiesテーブル
id – integer
name – string
departmentsテーブル
id – integer
company_id – integer
name – string
employeesテーブル
id – integer
department_id – integer
name – string
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php namespace App; use Illuminate\Database\Eloquent\Model; class Company extends Model { /** * 会社の全従業員を取得 */ public function employees() { return $this->hasManyThrough('App\Employee', 'App\Department'); } } |
- 第1引数 最終的に取得したいモデル名
- 第2引数 仲介するモデル名
② LaravelでhasManyThroughを使う(第1、2、3、4引数)
リレーションのキーをカスタマイズする場合は、以下のように指定。
companiesテーブル
id – integer
name – string
departmentsテーブル
id – integer
company_id – integer
name – string
employeesテーブル
id – integer
department_id – integer
name – string
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php namespace App; use Illuminate\Database\Eloquent\Model; class Company extends Model { /** * 会社の全従業員を取得 */ public function employees() { return $this->hasManyThrough('App\Employee', 'App\Department', 'company_id', 'department_id'); } } |
- 第1引数 最終的に取得したいモデル名
- 第2引数 仲介するモデル名
- 第3引数 仲介するモデルの外部キー名
- 第4引数 最終的に取得したいモデルの外部キー名
③ LaravelでhasManyThroughを使う(第1、2、3、4、5、6引数)
リレーションのキーをより細かくカスタマイズする場合は、以下のように指定。
companiesテーブル
id – integer
name – string
departmentsテーブル
id – integer
company_id – integer
name – string
employeesテーブル
id – integer
department_id – integer
name – string
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php namespace App; use Illuminate\Database\Eloquent\Model; class Company extends Model { /** * 会社の全従業員を取得 */ public function employees() { return $this->hasManyThrough('App\Employee', 'App\Department', 'company_id', 'department_id', 'id', 'id'); } } |
- 第1引数 最終的に取得したいモデル名
- 第2引数 仲介するモデル名
- 第3引数 仲介するモデルの外部キー名
- 第4引数 最終的に取得したいモデルの外部キー名
- 第5引数 リレーション元のローカルキー名
- 第6引数 最終的に取得したいモデルのローカルキー名
参考:Laravel 5.5 Eloquent:リレーション
④ LaravelでhasManyThroughを使う(第1、2、3、4、5、6引数) 中間テーブルにどちらの外部キーも持っていた場合
3つテーブルが以下のようなカラム配置になっていた場合(中間テーブルにどちらの外部キーも持っていた場合)のhasManyThroughの使い方はこれ。
companiesテーブル
id – integer
name – string
departmentsテーブル
id – integer
company_id – integer
enployee_id integer
name – string
employeesテーブル
id – integer
name – string
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php namespace App; use Illuminate\Database\Eloquent\Model; class Company extends Model { /** * 会社の全従業員を取得 */ public function employees() { return $this->hasManyThrough('App\Employee', 'App\Department', 'company_id', 'id', null, 'enployee_id') } } |
- 第1引数 最終的に取得したいモデル名
- 第2引数 仲介するモデル名
- 第3引数 仲介するモデルの外部キー名
- 第4引数 最終的に取得したいモデルのローカルキー名
- 第5引数 最終的に取得したいモデルの外部キー名
- 第6引数 最終的に取得したモデルと仲介するモデルを紐付けるキー名
公式リファレンスにはこのパターンの取得方法が書かれていなかったため、以下の記事を参考にしてリレーションの取得に成功。ただあくまでに参考程度に。
まず使っているLaravelのバージョンにあわせたリファレンスを読み込むのが大事ですね。