WSLで書籍管理用のプロジェクトを作成したので、このまま開発を進めていこうと思います。
現状、開発環境としてLwravel12、Breezeでのユーザー認証、MySQL、phpMyAdminが手元にある状態です。
1. 各種設定の確認
まずは Docker Desktop を起動し、次に Laravel Sail を Ubuntu のターミナルから起動します。
以下は Laravel Sail の起動方法です。
|
1 |
./vendor/bin/sail up -d |
環境作成時の復習となりますが、アクセスURLは以下となります。
# プロジェクトトップページ
http://localhost# phpMyAdmin
http://localhost:8081
phpMyAdminでデータベースを確認すると、「laravel」というデータベースが作成されています。
これは、Breeze をインストールしたときに自動生成されるデータベースのようです。
せっかくなので、ここにシステム用のテーブルを作成していくことにします。

2. マイグレーションでDBテーブルを新規作成する
2-1. テーブルの設計・マイグレーション
では、今回のメイン作業である、データベースのテーブル作成に入ります。
マンガや文庫を管理システムを作成するので、それっぽいテーブル構成を考えました。
Laravel でのテーブル名は複数形にするのが命名規則のようですのでその通りにします。
- カテゴリマスタテーブル(m_categories)
- 出版社マスタテーブル(m_publishers)
- 著者テーブル(authors)
- 書影テーブル(calligraphy)
- タグテーブル(tags)
- 書籍テーブル(books)
とりあえず、上記のようなテーブルがあればいい感じに管理できるような気がします。
まずかったら後で修正すればいいか、という考えで作成してみます。
ER図にすると以下のような感じです。

余談ですが、こちらの画像はMermaid記法という形式で、今回のテーブル構成に基づいたER図(実体関連図)のコードを作成し、Mermaid Live Editor というサイトに貼り付け、画像としてダウンロードしたものです。
便利なので、使ってみてはいかがでしょうか。
では、まず基本的なところから。
マイグレーションファイルを新規作成するには以下の形式です。
sail artisan make:migration マイグレーションファイル名
また、マイグレーションファイルはモデルとセットで作成することが可能です。
その場合にはモデルを作成する際の最後に -m オプションをつけます。この際のモデル名は単数形で指定します。
sail artisan make:model モデル名(単数形) -m
なので、Book モデルとマイグレーションファイルを作成する場合には、上記の書式に沿って次のコマンドを実行します。
sail artisan make:model Book -m
作成したマイグレーションファイルは、 database/migrations ディレクトリ内にタイムスタンプが付いたファイル名でマイグレーションファイルが作成されます。ファイルの中には、 upメソッド と downメソッド が記述されています。
upメソッドには、マイグレート実行時に行うことを記述します。テーブルを新規作成する際には、テーブル内のカラム情報を設定していきます。
downメソッドには、処理を取り消す際に行うことを記述します。
2-2. 「カテゴリ」マスタと「出版社」マスタのマイグレーションファイルの作成
まずはマスターテーブルの2つを先に作成します。
というのも、 m_*** のように、少し変色的なテーブル名にする予定なので、その対策も書き残しておきたいからです。
2-2-1. マイグレーション時にモデルファイルを一緒に生成する
カテゴリマスタテーブル(m_categories)と出版社マスタテーブル(m_publishers)のマイグレーションファイル、モデルファイルを作成します。
下記コマンドを Ubuntu のターミナルから実行します。
|
1 2 3 4 5 |
# カテゴリ sail artisan make:model Category -m # 出版社 sail artisan make:model Publisher -m |
実際にコマンドを実行すると、下のようになります。
各モデルファイルと、マイグレーションファイルが生成されたようです。
|
1 2 3 4 5 6 7 8 9 |
# カテゴリ(m_categories)テーブル $ sail artisan make:model Category -m INFO Model [app/Models/Category.php] created successfully. INFO Migration [database/migrations/xxxx_xx_xx_xxxxxx_create_categories_table.php] created successfully. # 出版社(m_publishers)テーブル $ sail artisan make:model Publisher -m INFO Model [app/Models/Publisher.php] created successfully. INFO Migration [database/migrations/xxxx_xx_xx_xxxxxx_create_publishers_table.php] created successfully. |
(メモ)xxxx_xx_xxxx には、実行した年・月・日・時刻が入ります。
make:model Category:app/Models/Category.phpファイル(モデル)を作成します。make:model Publisher:app/Models/Publisher.phpファイル(モデル)を作成します。-m(または--migration): 対応するマイグレーションファイルも同時に作成するよう指示します。
2-2-2. テーブル名を認識するようモデルファイルを編集する
Laravel のモデルは、デフォルトでモデル名の複数形をテーブル名として自動的に解決します。そのため、Category モデルを作成した場合、Laravelは自動的に categories テーブルを参照しようとします。
今回作成する m_categories テーブルを参照させるためには、作成されたモデルファイル(’app/Models/Category.php’)を開き $table プロパティを手動で追記する必要があります。
app/Models/Category.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Category extends Model { use HasFactory; /** * モデルに関連付けるテーブル * * @var string */ protected $table = 'm_categories'; // ここを 'm_categories' に設定 // } |
app/Models/Publisher.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Publisher extends Model { use HasFactory; /** * モデルに関連付けるテーブル * * @var string */ protected $table = 'm_publishers'; // ここを 'm_publishers' に設定 // } |
2-3. マイグレーションファイルの upメソッド の編集
マイグレーションファイルの upメソッド 内に、テーブルカラムの詳細を記述していきます。
2-3-1. カラム設定時のルール
追加したいカラムは、以下のルールでコードを記述します。
$table->データ型(‘カラム名’)->カラム修飾子
2-3-2. データ型とカラム修飾子
マイグレーションファイルでよく使うデータの型は次の表のとおりです。
| マイグレーションファイルで 使うデータ型 |
デーテベース内の データ型 |
使用時・備考 |
|---|---|---|
| integer | INTEGER | 整数 |
| string | VARCHAR | 名前など短めの文字列 目安として255文字程度まで |
| text | TEXT | 本文などの文字列 日本語なら16,384文字程度まで |
| longText | LONGTEXT | タグ等を含む文字列 目安として1GB |
| unsignedBiginteger foreignId |
符号なしBIGINT | 他のテーブルのID |
| boolean | BOOLEAN | true/false |
| date | DATE | 日付 |
| dateTime | DATETIME | 日時 |
カラム修飾子の種類
よく使うカラム修飾子は以下のようなものがあります。特に nullable は頻度が高いです。
| 修飾子 | 使用時 |
|---|---|
| nullable() | NULL値を許容 入力されない可能性があるカラムに設定する |
| after(‘カラム名’) | 指定したカラムの後に設置する |
| default(‘値’) | デフォルトで入れる値を設定する |
| unique | 一意のデータを保証する |
2-4. upメソッド内にカラム設定を記述
以上を踏まえて、マイグレーションファイルの upメソッド 内のテーブル名およびカラム設定を編集します
カテゴリマスタ、出版社マスタは以下のような内容とします。
ちなみに「カテゴリ」には、文芸書、実用書、ビジネス書、専門書、児童書、コミックなどの分類を入力予定です。
2-4-1. テーブル設計
カテゴリマスタテーブル
| No | カラム名 | データ型 | カラム修飾子 | 役割 |
|---|---|---|---|---|
| 1 | id | id | 管理ID | |
| 2 | created_at | timestamps | 登録日時 | |
| 3 | updated_at | timestamps | 更新日時 | |
| 4 | is_deleted | boolean | 削除フラグ | |
| 5 | category_name | string | unique | カテゴリ名 |
出版社マスタテーブル
| No | カラム名 | データ型 | カラム修飾子 | 役割 |
|---|---|---|---|---|
| 1 | id | id | 管理ID | |
| 2 | created_at | timestamps | 登録日時 | |
| 3 | updated_at | timestamps | 更新日時 | |
| 4 | is_deleted | boolean | 削除フラグ | |
| 5 | publisher_name | string | unique | 出版社名 |
| 6 | publisher_kana | string | nullable | 出版社かな |
| 7 | memo | text | nullable | 備考 |
2-4-2. マイグレーションファイル
database/migrations/xxxx_xx_xx_xxxxxx_create_categories_table.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
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('m_categories', function (Blueprint $table) { // 'categories'を'm_categories'に変更 // id: 管理ID $table->id(); // タイムスタンプ $table->timestamps(); // created_at, updated_at // is_deleted: 削除フラグ $table->boolean('is_deleted')->default(false); // category_name: カテゴリ名 // カテゴリ名が一意であることを保証するため、unique() を追加します。 $table->string('category_name', 100)->unique(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('m_categories'); } }; |
カテゴリマスタテーブルの定義のポイント
| カラム名 | 型・設定 | 備考 |
|---|---|---|
| id | $table->id() | 管理ID(主キー) |
| timestamps | $table->timestamps() | created_at と updated_at を自動で追加。 |
| is_deleted | $table->boolean(‘is_deleted’)->default(false) | 削除フラグ。デフォルトは false(未削除)。 |
| category_name | $table->string(‘category_name’, 100)->unique() | カテゴリ名。 100文字までの文字列で、カテゴリ名が重複しないように unique() 制約を付けています。 |
database/migrations/xxxx_xx_xx_xxxxxx_create_publishers_table.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
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('m_publishers', function (Blueprint $table) { // 'publishers'を'm_publisher'に変更 // id: 管理ID $table->id(); // タイムスタンプ $table->timestamps(); // created_at, updated_at // is_deleted: 削除フラグ $table->boolean('is_deleted')->default(false); // publisher_name: 出版社名 // 出版社名が一意であることを保証するため、unique() を追加します。 $table->string('publisher_name', 255)->unique(); // publisher_kana: 出版社名かな (NULL許容) $table->string('publisher_kana', 255)->nullable(); // memo: 備考 (NULL許容) $table->text('memo')->nullable(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('m_publishers'); } }; |
出版社マスタテーブルの定義のポイント
| カラム名 | 型・設定 | 備考 |
|---|---|---|
| id | $table->id() | 管理ID(主キー) |
| timestamps | $table->timestamps() | created_at と updated_at を自動で追加。 |
| is_deleted | $table->boolean(‘is_deleted’)->default(false) | 削除フラグ。デフォルトは false(未削除)。 |
| publisher_name | $table->string(‘publisher_name’, 255)->unique() | 出版社名。 255文字までの文字列で、出版社名が重複しないよう unique() 制約を付けています。 |
| publisher_kana | $table->string(‘publisher_kana’, 255)->nullable() | 出版社名かな。NULLを許容。 |
| memo | $table->text(‘memo’)->nullable() | 備考。長文用の text 型で、NULLを許容。 |
3. マスタテーブル以外のテーブルの作成
3-1. テーブルの内容について
同様にして、booksテーブル以外のテーブルを作成します。
- 著者テーブル(authors)
- タグテーブル(tags)
- 書影テーブル(calligraphy)
書影テーブルですが、「calligraphy」は複数形がない単語となるので、ちょっとイレギュラー気味に処理が必要になるかもしれません。
何事もトライエラーの心で挑みます。
それぞれのテーブルの内容は以下とします。
1.authors(著者)テーブル
| No | カラム名 | データ型 | カラム修飾子 | 役割 |
|---|---|---|---|---|
| 1 | id | id | 管理ID | |
| 2 | created_at | timestamps | 登録日時 | |
| 3 | updated_at | timestamps | 更新日時 | |
| 4 | is_deleted | boolean | default(false) | 削除フラグ |
| 5 | author_name | string | 著者名 | |
| 6 | author_kana | string | nullable | 著者名かな |
| 7 | author_job | string | nullable | 著者肩書 |
| 8 | book_id | id | 書籍ID(外部キー) |
2.tags(タグ)テーブル
| No | カラム名 | データ型 | カラム修飾子 | 役割 |
|---|---|---|---|---|
| 1 | id | id | 管理ID | |
| 2 | created_at | timestamps | 登録日時 | |
| 3 | updated_at | timestamps | 更新日時 | |
| 4 | is_deleted | boolean | default(false) | 削除フラグ |
| 5 | tag | string | タグ名 | |
| 6 | book_id | id | 書籍ID(外部キー) |
3.calligraphy(書影)テーブル
| No | カラム名 | データ型 | カラム修飾子 | 役割 |
|---|---|---|---|---|
| 1 | id | id | 管理ID | |
| 2 | created_at | timestamps | 登録日時 | |
| 3 | updated_at | timestamps | 更新日時 | |
| 4 | is_deleted | boolean | default(false) | 削除フラグ |
| 5 | filepath | string | 画像までのパス | |
| 6 | book_id | id | 書籍ID(外部キー) |
各テーブルのメモ
基本的に、複数登録に対応できるように設計しています。
「著者」テーブルに関して、例えば小説を例に取ると、原作者、イラストレーター、マップ制作者、機器デザインなどの方々が参画している場合、それぞれの肩書と名前を登録できるようにしています。
なので、著者肩書には「イラスト」 「挿絵」 「構成」 「キャラクター原案」 などを登録予定。
「タグ」テーブルには、関連付けるワードやジャンル(ミステリー、ファンタジー、歴史小説、SF、ホラー、ロマンス、ノンフィクション、自己啓発など)を登録予定。
「書影」テーブルには、本の画像を登録予定。これも複数登録できるようにします。
上記3つのテーブルは外部キーを設定しているところが、マスタテーブルとは異なります。
3-2. マイグレーションファイルの作成
以下のコマンドを順番に実行して、モデルファイルとマイグレーションファイルを作成します。
|
1 2 3 4 5 6 7 8 |
# 著者 (Author) sail artisan make:model Author -m # タグ (Tag) sail artisan make:model Tag -m # 書影 (Calligraphy) sail artisan make:model Calligraphy -m |
3-3. 各マイグレーションファイルの編集
3-3-1. 著者テーブル
database/migrations/xxxx_xx_xx_xxxxxx_create_authors_table.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up(): void { Schema::create('authors', function (Blueprint $table) { $table->id(); $table->timestamps(); $table->boolean('is_deleted')->default(false); // 削除フラグ // 著者情報 $table->string('author', 255); // 著者名 $table->string('autohr_kana', 255)->nullable(); // 著者名かな $table->string('author_job', 100)->nullable(); // 著者肩書 (著、訳、絵など) // 外部キー: booksテーブルのidと紐付け $table->foreignId('book_id') ->constrained('books') // booksテーブルのidを参照 ->onDelete('cascade'); // 書籍削除時に著者データも削除 }); } public function down(): void { Schema::dropIfExists('authors'); } }; |
3-3-2. タグテーブル
database/migrations/xxxx_xx_xx_xxxxxx_create_tags_table.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up(): void { Schema::create('tags', function (Blueprint $table) { $table->id(); $table->timestamps(); $table->boolean('is_deleted')->default(false); // 削除フラグ // タグ情報 $table->string('tag', 100); // タグ名 // 外部キー $table->foreignId('book_id') ->constrained('books') ->onDelete('cascade'); }); } public function down(): void { Schema::dropIfExists('tags'); } }; |
3-3-3. 書影テーブル
書影テーブルは複数形がない英単語を選びましたので、少し特殊な手順が必要かもしれないのですが実践してみます。
例のようにコマンドを実行します。
|
1 2 3 4 5 |
$ sail artisan make:model Calligraphy -m INFO Model [app/Models/Calligraphy.php] created successfully. INFO Migration [database/migrations/xxxx_xx_xx_xxxxxx_create_calligraphies_table.php] created successfully. |
おお、懸念した通り y で終了している単語は自動的に ies をつけて複数形にしているので、できあがったマイグレーションファイルのファイル名が複数形っぽい単語になっています。ここではしなくてもいいのに。。。
ということで、 upメソッドの先頭の schema::create() 行で、テーブル名を明示的に calligraphy と指定しています。
また、モデルファイルの方も、テーブル名を別途指定しています。
database/migrations/xxxx_xx_xx_xxxxxx_create_calligraphies_table.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up(): void { // テーブル名を指定通り 'calligraphy' にするか、Laravelの規約通り 'calligraphies' にするか // ここではモデルとの整合性のため、明示的に 'calligraphy' とすることをお勧めします。 // もしファイル名が create_calligraphies... であっても、ここは create('calligraphy'... と書けます。 Schema::create('calligraphy', function (Blueprint $table) { $table->id(); $table->timestamps(); $table->boolean('is_deleted')->default(false); // 削除フラグ // 書影情報 $table->string('filepath', 255); // ファイルパス $table->text('memo')->nullable(); // 備考 // 外部キー $table->foreignId('book_id') ->constrained('books') ->onDelete('cascade'); }); } public function down(): void { Schema::dropIfExists('calligraphy'); } }; |
app/Models/Calligraphy.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Calligraphy extends Model { use HasFactory; /** * モデルに関連付けるテーブル * * @var string */ protected $table = 'calligraphy'; // ここを 'calligraphy' に設定 // } |
再度ここにもメモを残しておきます。
make:model Calligraphy -m を実行した場合、Laravelはテーブル名を calligraphies (複数形) としてマイグレーションを作成しようとします。 テーブル名 calligraphy (単数形扱い) を使用する場合は、上記コードのように Schema::create('calligraphy', ...) と書き換え、Calligraphy モデル側にも $table = 'calligraphy'; の指定が必要になります。
4. Bookテーブルの作成
最後に、中心になる書籍(books)テーブルを作成します。
テーブルの関係は工程2に ER図 を載せていますので参照してください。
これまで同様、作成コマンドを Ubuntu ターミナルから実行します。
|
1 2 3 |
$ sail artisan make:model Book -m INFO Model [app/Models/Book.php] created successfully. INFO Migration [database/migrations/xxxx_xx_xx_xxxxxx_create_books_table.php] created successfully. |
結果、モデルファイル(app/Models/Book.php)と、マイグレーションファイル(database/migrations/xxxx_xx_xx_xxxxxx_create_books_table.php)の2つが作成されます。
4-1. マイグレーションファイルの編集
booksテーブル は下のような内容とします。
| No | カラム名 | データ型 | カラム修飾子 | 役割 |
|---|---|---|---|---|
| 1 | id | id | 管理ID | |
| 2 | created_at | timestamps | 登録日時 | |
| 3 | updated_at | timestamps | 更新日時 | |
| 4 | is_deleted | boolean | default(false) | 削除フラグ |
| 5 | title | string | 書名 | |
| 6 | title_kana | string | nullable | 書名かな |
| 7 | subtitle | string | nullable | サブタイトル |
| 8 | volume_number | string | nullable | 巻数 |
| 9 | isbn_code | string | nullable | ISBNコード |
| 10 | publication_year | year | nullable | 出版年 |
| 11 | price | integer | nullable | 価格 |
| 12 | description | text | nullable | 概要 |
| 13 | memo | text | nullable | 備考 |
| 14 | category_id | id | nullable | カテゴリID(外部キー) |
| 15 | publisher_id | id | 出版社ID(外部キー) |
マイグレーションファイルの upメソッド 内を編集。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
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('books', function (Blueprint $table) { // 1. 基本IDとタイムスタンプ $table->id(); // id: 管理ID $table->timestamps(); // created_at, updated_at // 2. 削除フラグ $table->boolean('is_deleted')->default(false); // 3. 書籍の基本情報 $table->string('title', 255); // title: 書名 $table->string('title_kana', 255)->nullable(); // title_kana: 書名かな $table->string('subtitle', 255)->nullable(); // subtitle: サブタイトル (NULL許容) // volume_number: 巻数 (「1」「上」「下」「外伝」などに対応できるよう文字列型にしています) $table->string('volume_number', 50)->nullable(); $table->string('isbn_code', 13)->unique()->nullable(); // isbn_code: ISBNコード // 4. マスタテーブルとのリレーション (外部キー) // publisher_id: 出版社 (m_publishersテーブルのidを参照) $table->foreignId('publisher_id') ->nullable() ->constrained('m_publishers') // テーブル名を明示的に指定 ->onUpdate('cascade') ->onDelete('set null'); // 出版社が消えても書籍データは残し、IDをNULLにする // publication_year: 出版年 $table->year('publication_year')->nullable(); // category_id: カテゴリ (m_categoriesテーブルのidを参照) $table->foreignId('category_id') ->nullable() ->constrained('m_categories') // テーブル名を明示的に指定 ->onUpdate('cascade') ->onDelete('set null'); // カテゴリが消えても書籍データは残し、IDをNULLにする // 5. その他詳細 $table->integer('price')->nullable(); // price: 価格 $table->text('description')->nullable(); // description: 概要 $table->text('memo')->nullable(); // memo: 備考 }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('books'); } }; |
4-1-1. 定義のポイント
volume_number(巻数) の型:integerではなくstringにしています。これは「上巻・下巻」「3.5巻」「外伝」といった数字以外の表現に対応するためです。
- 外部キー制約 (
constrained):constrained('m_publishers')のようにテーブル名を明示することで、Laravelの命名規約(publishers)と異なるテーブル名(m_publishers)でも正しく紐付けられます。
- 削除時の挙動 (
onDelete('set null')):- マスタデータ(出版社やカテゴリ)が削除された際、書籍データごと消えるのは危険なため、紐付けだけ外れる(NULLになる)ように設定しています。
- 逆に、子テーブル(著者・書影・タグ)のマイグレーションでは、書籍が消えたら道連れになるよう
onDelete('cascade')に設定(前回の回答通り)しておくと、データ整合性が保たれます。
5. マイグレーションファイルの反映
5-1. マイグレーションを実行
マイグレーションファイルの内容をデータベースに反映させるには、マイグレートコマンドを実行します。
sail artisan migrate
後述しますが、マイグレートを実行するとデータベース内の migrationsテーブルに、マイグレートの実行記録が残ります。
5-2. 実行順序の注意
マイグレーション(sail artisan migrate)を実行する際は、親テーブルが先に存在している必要があります。
Laravel はマイグレーションファイルの作成日時順(ファイル名の先頭の日付)に実行するため、以下の順序になるようにファイルの日付を確認・調整するか、一度全て作り直す場合は全てのテーブルをドロップしてから実行してください。
m_publishers/m_categories(マスタ)books(マスタを参照)authers/calligraphy/tags(booksを参照)
成功すると、データベース内にテーブルが出来上がります。

5-2-1. マイグレーションの実行記録
migrationsテーブルには、マイグレーションを行った実行記録が残ります。
テーブル内の batch カラムには何回目のマイグレートコマンドによって処理が行われたかが記録されます。



