DBのリレーション関連ってわかりづらいですよね。
わからないのも恥ずかしいので自分なりに勉強したものを簡潔にまとめてみました。
ついでにLaravelのEloquentでの指定方法についても記述します。
チートシート
形式 | アソシエーション | 第一引数 | 第二引数 | 第三引数 | 第四引数 |
1対1 | hasOne/belongsTo | 対象先モデル | 自モデルカラム | 対象先モデルカラム | |
1対多 | hasMany/belongsTo | 対象先モデル | 対象先モデルカラム | 自モデルカラム | |
多対1 | belongsTo | 対象先モデル | 自モデルカラム | 対象先モデルカラム | |
多対多 | belongsToMany | 対象先モデル | 中間or結合テーブル | 自モデルカラムの外部キー名 | 対象先モデルカラムの外部キー名 |
解説
1対1の場合(hasOne/belongsTo)
飼い主基本情報テーブル(kainushi_basic_info)と飼い主詳細情報テーブル(kainushi_detail_info)をuser_idで紐づける場合を想定します。
// app/models/KainushiBasicInfo.php
public function kainushiDetail()
{
return $this->hasOne(KainushiDetailInfo::class, 'user_id', 'user_detail_id');
}
// app/models/KainushiDetailInfo.php
public function kainushi()
{
return $this->belongsTo(KainushiBasicInfo::class, 'user_detail_id', 'user_id');
}
1対多の場合(hasMany)
飼い主に対して、ペットは複数匹いる場合もあると思います。
飼い主(user_id)に対して、ペットは個別にIDを持っている(pet_id)と想定し、
それをpet_basic_infoのkainushi_idと紐づけることで、複数ペットがいる場合でも飼い主を特定できるようにします。
// app/models/KainushiBasicInfo.php
public function pets()
{
return $this->hasMany(PetBasicInfo::class, 'kainushi_id', 'user_id');
}
多対1の場合(belongsTo)
上記とは逆にペットから見て飼い主は一人なので、pet_basic_infoから見た場合は多対1になるため、belongsToを使用します。
// app/models/PetBasicInfo.php
public function kainushi()
{
return $this->belongsTo(KainushiBasicInfo::class, 'kainushi_id', 'user_id');
}
多対多の場合(BelongsToMany)
ペットを題材に進めてきましたが、まっったくいい例えが浮かばなかったので、変更します。
以下のテーブル構成を想定します。
この場合、usersテーブルとcategoriesテーブルの関係が多対多になり、catogory_userテーブルは中間テーブルになります。
ちなみにLaravelでは、中間テーブルの命名規則に
・2つのテーブルをアルファベット順に並び替える
・テーブル名は単数系にし、”_”でつなげる
ことが定められています。
// app/models/User.php
public function categories()
{
return $this->belongsToMany(Category::class, 'category_user', 'user_id', 'category_id');
}
// app/models/Category.php
public function users()
{
return $this->belongsToMany(User::class, 'category_user', 'category_id', 'user_id');
}
まとめ
Laravelのリレーション関係の理解がまだまだだなと思いました。
今回はhasOne/hasMany/belongsTo/belongsToManyの4つのみ記述しましたが、その他も存在するのでまた勉強次第まとめていこうと思います。
※大いに参考にさせていただきました。
https://readouble.com/laravel/7.x/ja/eloquent-relationships.html#many-to-many
https://www.wakuwakubank.com/posts/377-laravel-relation-1/