この記事の最終更新日: 2023年9月6日
User と Tweet を例として、belongsToとhasOne、さらにhasManyの違いを説明します。
User と Tweet の関係(hasMany&belongsTo)
このケースでは、ユーザーは複数のツイートを持っていることができます。つまり、1つのユーザーに対して、複数のツイートが関連づけられる関係になります。

hasMany: User モデルから見ると、各ユーザーは複数のツイートを「持っています」。実際には、tweets テーブルが外部キー user_id を持っていて、それが各ツイートがどのユーザーに属しているかを示しています。このシナリオでは、ユーザーが持っているツイートにアクセスするためのリレーションは hasMany となります。
class User extends Model
{
public function tweets()
{
return $this->hasMany(Tweet::class);
}
}
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: このケースでは、各ユーザーは1つのプロフィールしか持たないと考えます。しかし、実際には profiles テーブルが外部キー user_id を持っていて、それが各プロフィールがどのユーザーに属しているかを示しています。このシナリオでは、User モデルから見て、ユーザーが持つプロフィールにアクセスするためのリレーションは hasOne となります。
class User extends Model
{
public function profile()
{
return $this->hasOne(Profile::class);
}
}
belongsTo: 一方、Profile モデルから見ると、プロフィールは1つのユーザーに「属しています」。profiles テーブルには user_id という外部キーがありますが、users テーブルにはそのような外部キーはありません。このシナリオでは、プロフィールが属しているユーザーにアクセスするためのリレーションは belongsTo となります。
class Profile extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}要するに、belongsToは「属している」関係を示し、関連するテーブルに外部キーを持つモデルで使用されます。一方、hasOneは「持っている」関係を示し、外部キーを持つテーブルを参照するモデルで使用されます。

大阪のエンジニアが書いているブログ。



コメント