コメント掲示板を作成するために,まず投稿されたコメントデータを格納する comments テーブルをデータベースに作成します.Laravel ではテーブルをマイグレーションファイルを実行することによって作成します.そのマイグレーションファイルを生成します.この時,Laravel はマイグレーションの名前からテーブル名と新しいテーブルを作成しようとしているかを推測します.
vagrant@ubuntu2204 laravelAuth $ php artisan make:migration create_comments_table ⏎
INFO Migration [database/migrations/2023_11_04_164822_create_comments_table.php] created successfully.
vagrant@ubuntu2204 laravelAuth $
上のコマンドで comments テーブルを作成するためのマイグレーションファイルが次のとおり生成されました.
database/migrations/yyyy_mm_dd_hhmmss_create_comments_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('comments', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('comments');
}
};
テーブル comments には件名 (title) と本文 (body) に加えて,投稿ユーザの ID (user_id) の属性を持たせます.もちろん,user_id は users テーブルの主キーを参照する外部キーになります.このリレーションシップに関する詳細はこちらを参照してください.
database/migrations/yyyy_mm_dd_hhmmss_create_comments_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('comments', function (Blueprint $table) {
$table->id();
$table->string('title', 255);
$table->text('body');
$table->unsignedBigInteger('user_id');
$table->timestamps();
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('comments');
}
};
マイグレーションを実行してテーブルを生成します.
vagrant@ubuntu2204 laravelAuth $ php artisan migrate:status ⏎ Migration name ..................................... Batch / Status 2014_10_12_000000_create_users_table ...................... [1] Ran 2014_10_12_100000_create_password_reset_tokens_table ...... [1] Ran 2019_08_19_000000_create_failed_jobs_table ................ [1] Ran 2019_12_14_000001_create_personal_access_tokens_table ..... [1] Ran 2023_11_03_101930_add_login_id_to_users_table ............. [1] Ran 2023_11_04_164822_create_comments_table ................... Pending vagrant@ubuntu2204 laravelAuth $ php artisan migrate ⏎ INFO Running migrations. 2023_11_04_164822_create_comments_table ................. 12ms DONE vagrant@ubuntu2204 laravelAuth $ php artisan migrate:status ⏎ Migration name ..................................... Batch / Status 2014_10_12_000000_create_users_table ...................... [1] Ran 2014_10_12_100000_create_password_reset_tokens_table ...... [1] Ran 2019_08_19_000000_create_failed_jobs_table ................ [1] Ran 2019_12_14_000001_create_personal_access_tokens_table ..... [1] Ran 2023_11_03_101930_add_login_id_to_users_table ............. [1] Ran 2023_11_04_164822_create_comments_table ................... [2] Ran vagrant@ubuntu2204 laravelAuth $
sqlite> select * from users; ⏎ id|name|email|email_verified_at|password|remember_token|created_at|updated_at|login_id|student_id 1|A. Sample|a@sample.com|2023-11-03 00:05:00|$2y$12$1o9lB/bK29D/ctQ31oqR4OWPbuwMfYFREeE1C3mMqoeZisWnlImF6||2023-11-03 00:01:01|2023-11-03 00:01:01|user_a|6300997 2|B. Sample|b@sample.com|2023-11-03 00:06:00|$2y$12$FDhbZGy0w7vLtbODkmhhuu/oOKmGzfxOx/.nuM6LHK6QWlFWfTgCO||2023-11-03 00:02:01|2023-11-03 00:02:01|user_b|6300998 3|C. Sample|c@sample.com|2023-11-03 00:07:00|$2y$12$RjPnebCTS6jUax8s7cE5ve2126fKorZ8XFIRxuo3dMGn7ilP1ahBu||2023-11-03 00:03:01|2023-11-03 00:03:01|user_c|6300999 sqlite> sqlite> .tables ⏎ comments migrations personal_access_tokens failed_jobs password_reset_tokens users sqlite> sqlite> .schema comments ⏎ CREATE TABLE IF NOT EXISTS "comments" ( "id" integer primary key autoincrement not null, "title" varchar not null, "body" text not null, "user_id" integer not null, "created_at" datetime, "updated_at" datetime, foreign key("user_id") references "users"("id") on delete cascade ); sqlite>