【Laravel】hasMany(hasOne)とbelongsToの違いについてわかりやすく解説!【Model】

hasMany belongsTo 違い PHP
この記事は約3分で読めます。

この記事の最終更新日: 2023年9月6日

User と Tweet を例として、belongsTohasOne、さらにhasManyの違いを説明します。

User と Tweet の関係(hasMany&belongsTo)

このケースでは、ユーザーは複数のツイートを持っていることができます。つまり、1つのユーザーに対して、複数のツイートが関連づけられる関係になります。

Laravel Model belongsTo

hasMany: User モデルから見ると、各ユーザーは複数のツイートを「持っています」。実際には、tweets テーブルが外部キー user_id を持っていて、それが各ツイートがどのユーザーに属しているかを示しています。このシナリオでは、ユーザーが持っているツイートにアクセスするためのリレーションは hasMany となります。

class User extends Model
{
    public function tweets()
    {
        return $this->hasMany(Tweet::class);
    }
}
belongsTo Laravel Model

belongsTo: 一方、Tweet モデルから見ると、各ツイートは1つのユーザーに「属しています」。tweets テーブルには user_id という外部キーがありますが、users テーブルにはそのような外部キーはありません。このシナリオでは、ツイートが属しているユーザーにアクセスするためのリレーションは belongsTo となります。

class Tweet extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

要するに、belongsToは「属している」関係を示し、関連するテーブルに外部キーを持つモデルで使用されます。hasManyは「持っている(複数)」関係を示し、外部キーを持つテーブルを参照するモデルで使用されます。

UserとProfileの関係(hasOne&belongsTo)

あるWebアプリケーションには、ユーザー(User)が登録されており、それぞれのユーザーにはプロフィール情報(Profile)が関連づけられているとします。

hasOne Laravel Model モデル

hasOne: このケースでは、各ユーザーは1つのプロフィールしか持たないと考えます。しかし、実際には profiles テーブルが外部キー user_id を持っていて、それが各プロフィールがどのユーザーに属しているかを示しています。このシナリオでは、User モデルから見て、ユーザーが持つプロフィールにアクセスするためのリレーションは hasOne となります。

class User extends Model
{
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}
belongsTo hasOne モデル Laravel

belongsTo: 一方、Profile モデルから見ると、プロフィールは1つのユーザーに「属しています」。profiles テーブルには user_id という外部キーがありますが、users テーブルにはそのような外部キーはありません。このシナリオでは、プロフィールが属しているユーザーにアクセスするためのリレーションは belongsTo となります。

class Profile extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

要するに、belongsToは「属している」関係を示し、関連するテーブルに外部キーを持つモデルで使用されます。一方、hasOneは「持っている」関係を示し、外部キーを持つテーブルを参照するモデルで使用されます。

コメント

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