今回は、前回記事の補足で、Laravelでリレーション先のカラムをid以外にする場合の書き方について解説します。
前回はhasOneとbelongsToメソッドを使って、リレーションを作る方法を紹介しました。
コードは次のようなシンプルな書き方でOK。
【hasOneメソッド(Userモデルに設定)】
1 2 3 |
public function address(){ return $this->hasOne(Address::class); } |
【belongsToメソッド(Addressモデルに設定)】
1 2 3 |
public function user(){ return $this->belongsTo(User::class); } |
なぜなら、デフォルトで次のように決まっているからです。
- テーブルのidカラムは【モデル名_id】とする。Userテーブルなら、【user_id】となる。
- リレーションを定義するとき、このidカラムを使うなら、細かい情報は入れなくてOK。
ただカラム名をデフォルトから変更したり、idカラム以外で連携させたい場合には、コードを少し変える必要があります。
カラム名を変更してリレーションを作る場合
まずはカラム名を変更した場合。
たとえばアドレステーブルのuser_idカラムを「player_id」にしたとします。
この場合、hasOneメソッドの第二引数には ‘player_id’ と入れます。
1 2 3 |
public function address(){ return $this->hasOne(Address::class, 'player_id'); } |
belongsToメソッドを使う場合にも同じように、第二引数には ‘player_id’ と入れます。
1 2 3 |
public function user(){ return $this->belongsTo(User::class, 'player_id'); } |
id以外のカラムと連携させる場合
ユーザーテーブルのidではなく、emailカラムと連携したいとします。
この場合、hasOne関数の第三引数に ‘email’ と入れます。
1 2 3 |
public function address(){ return $this->hasOne(Address::class, 'player_id', 'email'); } |
さいごに
特に理由がなければ、デフォルトのリレーションルールに沿ってリレーションを設定するほうがラクです。
リレーションについては、他の記事でも色々紹介しているので、気になるものがあれば、併せてチェックしてくださいね。