この記事の最終更新日: 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
は「持っている」関係を示し、外部キーを持つテーブルを参照するモデルで使用されます。
大阪のエンジニアが書いているブログ。
コメント