データベースのリレーションシップ(1対多)

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対多について解説しました。次回は多対多について解説します。

コメントを残す

CAPTCHA