1対多の関係性の設定方法
前回は1対1の関係性を設定しました。今回は1対多の関係性を設定します。ここではUserモデルとPostモデルを使用し、ユーザーが複数の投稿と関係性を設定できるようにします。Postモデルは以下のようになります。
カラム名 | 内容 |
user_id | 関連付けるUserのID 外部キー |
title | 投稿のタイトル |
body | 投稿の中身 |
上記の構造をデータベースに設定するためにはマイグレーションファイルを以下のように記述します。
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->foreignId("user_id")->constrained();
$table->string("title");
$table->text("body");
$table->timestamps();
});
これは、前回のマイグレーションファイルとほぼ同じ内容です。
モデルに関係性を記述
次に、モデルに関係性を記述します。Userモデル、Postモデルに以下のようにメソッドを追加します。
Userモデル
public function posts() {
return $this->hasMany(Post::class);
}
Postモデル
public function user() {
return $this->belongsTo(User::class);
}
hasManyメソッドは1対多のリレーションシップを定義するメソッドで、指定されたモデルのクラスを参照するようにします。
関係性のテスト
tinkerを使用して関係性をテストします。以下のコードでダミーのポストを生成します。ユーザーは前回作成したものを使用します。
use App\Models\User;
use App\Models\Post;
#ダミーポスト1
$post1 = new Post();
$post1->user_id = 1;
$post1->title = "test1";
$post1->body = "test1";
$post1->save();
#ダミーポスト2
$post2 = new Post();
$post2->user_id = 1;
$post2->title = "test1";
$post2->body = "test2";
$post2->save();
ここで、user_idにはダミーユーザーのidを設定します。
次に、データベースの関係性が設定できているかどうか確認します。以下のコマンドでユーザーからポスト、ポストからユーザーにアクセスできるか確認してください。ユーザーからポストでは、ダミーポスト1と2の二つが表示されることを確認してください。
$user = User::find(1);
$user->posts;
$post1->user;
$post2->user;
上記のコマンドで、ポスト、ユーザーの情報が取得できれば成功です。
今回はリレーションシップの1対多について解説しました。次回は多対多について解説します。