LaravelでEloquentを使用したリレーションの書き方

Laravel

DBのリレーション関連ってわかりづらいですよね。
わからないのも恥ずかしいので自分なりに勉強したものを簡潔にまとめてみました。
ついでにLaravelのEloquentでの指定方法についても記述します。

チートシート

形式アソシエーション第一引数第二引数第三引数第四引数
1対1hasOne/belongsTo対象先モデル自モデルカラム対象先モデルカラム
1対多hasMany/belongsTo対象先モデル対象先モデルカラム自モデルカラム
多対1belongsTo対象先モデル自モデルカラム対象先モデルカラム
多対多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/


タイトルとURLをコピーしました