【Laravel】リレーションの外部キー・主キーの書き方を覚える
はじめに
普段 Laravel を使って開発をしています。
リレーションを頻繁に使うのですが、外部キー・主キーの順番や書き方が覚えられず公式ドキュメントを確認してました。自分なりの覚え方を考えたので記事書くことにしました。理解に誤りがある場合はコメントで教えていただけますと幸いです 🙏
個人的覚え方
こちらのドキュメントを引用しながらhasOne
メソッドを例にとって書きます。
外部キー(第 2 引数)
外部キーについて、ドキュメントには以下のように書かれています。
Eloquent は、親モデル名に基づきリレーションの外部キーを決定します。この場合、Phone モデルは自動的に user_id 外部キーを持っているとみなします。この規約をオーバーライドしたい場合は、hasOne メソッドに2番目の引数を渡します。
return $this->hasOne(Phone::class, 'foreign_key');
残念ながら私の頭ではこの説明がスッと入ってこなくて、このように覚えるようにしてます。
-
親モデル(User モデル)から見た時
- 子モデル(Phone モデル)の
『このカラム』
を参照します -
『このカラム』
が外部キーでメソッドの第 2 引数に入れるもの - 外部キーのデフォルトは
モデル名_id
でこれに当てはまれば書く必要ない -
モデル名_id
の当てはまらない場合は、参照するカラム名を記載して明示する
- 子モデル(Phone モデル)の
つまり『このカラム』
がuser_id
であれば書く必要ないですが、参照するカラムがowner_user_id
などの場合は第 2 引数に書く必要がある。
主キー(第 3 引数)
続いて主キーについて、ドキュメントに以下のように書かれています。
さらに、Eloquent は、外部キーの値が親の主キーカラムに一致すると想定しています。つまり、Eloquent は、Phone レコードの user_id カラムでユーザーの id カラムの値を検索します。リレーションで id またはモデルの$primaryKey プロパティ以外の主キー値を使用する場合は、3番目の引数を hasOne メソッドに渡してください。
return $this->hasOne(Phone::class, 'foreign_key', 'local_key');
以下、個人的覚え方です。
-
親モデル(User モデル)から見た時
- 私(User モデル)の
『このカラム』
を参照してください -
『このカラム』
が主キーでメソッドの第 3 引数に入れるもの - 主キーのデフォルトは
id
またはid以外のprimaryKey
でこれに当てはまれば書く必要ない - デフォルトに当てはまらない場合は、参照してほしいカラム名を記載して明示する
- 私(User モデル)の
つまり『このカラム』
がid
またはid以外のprimaryKey
であれば書く必要ないですが、参照されるowner_user_id
などの場合は第 3 引数に書く必要がある。
Discussion