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); + } }