この記事の最終更新日: 2023年9月6日
User と Tweet を例として、belongsTo
とhasOne
、さらにhasMany
の違いを説明します。
User と Tweet の関係(hasMany&belongsTo)
このケースでは、ユーザーは複数のツイートを持っていることができます。つまり、1つのユーザーに対して、複数のツイートが関連づけられる関係になります。
![Laravel Model belongsTo](https://i0.wp.com/yurupro.cloud/wp-content/uploads/2023/09/hasMany.png?resize=1024%2C576&ssl=1)
hasMany: User
モデルから見ると、各ユーザーは複数のツイートを「持っています」。実際には、tweets
テーブルが外部キー user_id
を持っていて、それが各ツイートがどのユーザーに属しているかを示しています。このシナリオでは、ユーザーが持っているツイートにアクセスするためのリレーションは hasMany
となります。
class User extends Model
{
public function tweets()
{
return $this->hasMany(Tweet::class);
}
}
![belongsTo Laravel Model](https://i0.wp.com/yurupro.cloud/wp-content/uploads/2023/09/belongsTo.png?resize=1024%2C576&ssl=1)
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 モデル](https://i0.wp.com/yurupro.cloud/wp-content/uploads/2023/09/hasOne.png?resize=1024%2C576&ssl=1)
hasOne: このケースでは、各ユーザーは1つのプロフィールしか持たないと考えます。しかし、実際には profiles
テーブルが外部キー user_id
を持っていて、それが各プロフィールがどのユーザーに属しているかを示しています。このシナリオでは、User
モデルから見て、ユーザーが持つプロフィールにアクセスするためのリレーションは hasOne
となります。
class User extends Model
{
public function profile()
{
return $this->hasOne(Profile::class);
}
}
![belongsTo hasOne モデル Laravel](https://i0.wp.com/yurupro.cloud/wp-content/uploads/2023/09/belongsTo_hasOne.png?resize=1024%2C576&ssl=1)
belongsTo: 一方、Profile
モデルから見ると、プロフィールは1つのユーザーに「属しています」。profiles
テーブルには user_id
という外部キーがありますが、users
テーブルにはそのような外部キーはありません。このシナリオでは、プロフィールが属しているユーザーにアクセスするためのリレーションは belongsTo
となります。
class Profile extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
要するに、belongsTo
は「属している」関係を示し、関連するテーブルに外部キーを持つモデルで使用されます。一方、hasOne
は「持っている」関係を示し、外部キーを持つテーブルを参照するモデルで使用されます。
![ゆるプロ日記](https://i0.wp.com/yurupro.cloud/wp-content/uploads/2023/01/12245_paint.png?resize=100%2C100&ssl=1)
大阪のエンジニアが書いているブログ。
コメント