🏃

【Laravel】リレーションの外部キー・主キーの書き方を覚える

2023/01/15に公開

はじめに

普段 Laravel を使って開発をしています。
リレーションを頻繁に使うのですが、外部キー・主キーの順番や書き方が覚えられず公式ドキュメントを確認してました。自分なりの覚え方を考えたので記事書くことにしました。理解に誤りがある場合はコメントで教えていただけますと幸いです 🙏

個人的覚え方

こちらのドキュメントを引用しながらhasOneメソッドを例にとって書きます。

https://readouble.com/laravel/8.x/ja/eloquent-relationships.html

外部キー(第 2 引数)

外部キーについて、ドキュメントには以下のように書かれています。

Eloquent は、親モデル名に基づきリレーションの外部キーを決定します。この場合、Phone モデルは自動的に user_id 外部キーを持っているとみなします。この規約をオーバーライドしたい場合は、hasOne メソッドに2番目の引数を渡します。

Userモデル(親)ドキュメントから引用
return $this->hasOne(Phone::class, 'foreign_key');

残念ながら私の頭ではこの説明がスッと入ってこなくて、このように覚えるようにしてます。

  • 親モデル(User モデル)から見た時
    • 子モデル(Phone モデル)の『このカラム』を参照します
    • 『このカラム』が外部キーでメソッドの第 2 引数に入れるもの
    • 外部キーのデフォルトはモデル名_idでこれに当てはまれば書く必要ない
    • モデル名_id の当てはまらない場合は、参照するカラム名を記載して明示する

つまり『このカラム』user_idであれば書く必要ないですが、参照するカラムがowner_user_idなどの場合は第 2 引数に書く必要がある。

主キー(第 3 引数)

続いて主キーについて、ドキュメントに以下のように書かれています。

さらに、Eloquent は、外部キーの値が親の主キーカラムに一致すると想定しています。つまり、Eloquent は、Phone レコードの user_id カラムでユーザーの id カラムの値を検索します。リレーションで id またはモデルの$primaryKey プロパティ以外の主キー値を使用する場合は、3番目の引数を hasOne メソッドに渡してください。

Userモデル(親)ドキュメントから引用
return $this->hasOne(Phone::class, 'foreign_key', 'local_key');

以下、個人的覚え方です。

  • 親モデル(User モデル)から見た時
    • 私(User モデル)の『このカラム』を参照してください
    • 『このカラム』が主キーでメソッドの第 3 引数に入れるもの
    • 主キーのデフォルトはidまたはid以外のprimaryKeyでこれに当てはまれば書く必要ない
    • デフォルトに当てはまらない場合は、参照してほしいカラム名を記載して明示する

つまり『このカラム』idまたはid以外のprimaryKeyであれば書く必要ないですが、参照されるowner_user_idなどの場合は第 3 引数に書く必要がある。

GitHubで編集を提案

Discussion