Laravel ミニブログ作成3 投稿用テーブルとモデル

postsテーブルの作成

カラム名 内容
id(主キー) ID
user_id(外部キー) ユーザーのID
title タイトル
content 本文
created_at 作成日時
updated_at 更新日時

database/migrations/****_**_**_******_create_posts_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
+            $table->foreignId('user_id')->constrained()->cascadeOnDelete();
+            $table->string('title');
+            $table->text('content');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};

外部キーの設定
$table->foreignId('user_id')->constrained()->cascadeOnDelete();

  • マイグレーションの実行
    sail artisan migrate

    Postモデルの作成

  • モデルファイルの作成
    sail artisan make:model Post

    リレーションシップの設定

    「1人のユーザーは複数の投稿を作成できるが、1つの投稿は1人のユーザーに属する」という1対多のリレーションシップ(ユーザーが「1」で、投稿が「多」)。

  • Userモデル
    app/Models/User.php
<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use Illuminate\Contracts\Auth\MustVerifyEmail;

class User extends Authenticatable implements MustVerifyEmail
{
    //======== 中略 ========

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
        'password' => 'hashed',
    ];

+    // 1人のユーザーは複数の投稿を作成できる
+    public function posts()
+    {
+        return $this->hasMany(Post::class);
+    }
}
  • Postモデル
    app/Models/Post.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

+    // 1つの投稿は1人のユーザーに属する
+    public function user()
+    {
+        return $this->belongsTo(User::class);
+    }
}