【Laravel】hasManyThroughリレーションを使う方法まとめ

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引数 仲介するモデル名

② 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引数 最終的に取得したいモデルの外部キー名

③ 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引数 最終的に取得したいモデルのローカルキー名

参考: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引数 最終的に取得したモデルと仲介するモデルを紐付けるキー名

公式リファレンスにはこのパターンの取得方法が書かれていなかったため、以下の記事を参考にしてリレーションの取得に成功。ただあくまでに参考程度に。

まず使っているLaravelのバージョンにあわせたリファレンスを読み込むのが大事ですね。

 

参考:Laravelのリレーション hasManyThrough の使い方を毎回間違うのでメモ

参考:LaravelのEloquentORMでモデルベースのDBリレーション~基本からEagerロードまで~