【Laravel】 書籍管理システムを作る(1)マイグレーションでDBデーブルを作成

Laravel
記事内に広告が含まれています。

WSLで書籍管理用のプロジェクトを作成したので、このまま開発を進めていこうと思います。
現状、開発環境としてLwravel12、Breezeでのユーザー認証、MySQL、phpMyAdminが手元にある状態です。

1. 各種設定の確認

まずは Docker Desktop を起動し、次に Laravel Sail を Ubuntu のターミナルから起動します。
以下は Laravel Sail の起動方法です。

環境作成時の復習となりますが、アクセスURLは以下となります。

# プロジェクトトップページ
http://localhost

# phpMyAdmin
http://localhost:8081

phpMyAdminでデータベースを確認すると、「laravel」というデータベースが作成されています。
これは、Breeze をインストールしたときに自動生成されるデータベースのようです。
せっかくなので、ここにシステム用のテーブルを作成していくことにします。

 

2. マイグレーションでDBテーブルを新規作成する

2-1. テーブルの設計・マイグレーション

では、今回のメイン作業である、データベースのテーブル作成に入ります。

マンガや文庫を管理システムを作成するので、それっぽいテーブル構成を考えました。
Laravel でのテーブル名は複数形にするのが命名規則のようですのでその通りにします。

  1. カテゴリマスタテーブル(m_categories)
  2. 出版社マスタテーブル(m_publishers)
  3. 著者テーブル(authors)
  4. 書影テーブル(calligraphy)
  5. タグテーブル(tags)
  6. 書籍テーブル(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 のターミナルから実行します。

実際にコマンドを実行すると、下のようになります。
各モデルファイルと、マイグレーションファイルが生成されたようです。

(メモ)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
app/Models/Publisher.php

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


カテゴリマスタテーブルの定義のポイント

カラム名 型・設定 備考
id $table->id() 管理ID(主キー)
timestamps $table->timestamps() created_atupdated_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


出版社マスタテーブルの定義のポイント

カラム名 型・設定 備考
id $table->id() 管理ID(主キー)
timestamps $table->timestamps() created_atupdated_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テーブル以外のテーブルを作成します。

  1. 著者テーブル(authors)
  2. タグテーブル(tags)
  3. 書影テーブル(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. マイグレーションファイルの作成

以下のコマンドを順番に実行して、モデルファイルとマイグレーションファイルを作成します。

 

3-3. 各マイグレーションファイルの編集

3-3-1. 著者テーブル

database/migrations/xxxx_xx_xx_xxxxxx_create_authors_table.php

 

3-3-2. タグテーブル

database/migrations/xxxx_xx_xx_xxxxxx_create_tags_table.php

 

3-3-3. 書影テーブル

書影テーブルは複数形がない英単語を選びましたので、少し特殊な手順が必要かもしれないのですが実践してみます。
例のようにコマンドを実行します。

おお、懸念した通り y で終了している単語は自動的に ies をつけて複数形にしているので、できあがったマイグレーションファイルのファイル名が複数形っぽい単語になっています。ここではしなくてもいいのに。。。

ということで、 upメソッドの先頭の schema::create() 行で、テーブル名を明示的に calligraphy と指定しています。
また、モデルファイルの方も、テーブル名を別途指定しています。

database/migrations/xxxx_xx_xx_xxxxxx_create_calligraphies_table.php

 

app/Models/Calligraphy.php

再度ここにもメモを残しておきます。

make:model Calligraphy -m を実行した場合、Laravelはテーブル名を calligraphies (複数形) としてマイグレーションを作成しようとします。 テーブル名 calligraphy (単数形扱い) を使用する場合は、上記コードのように Schema::create('calligraphy', ...) と書き換え、Calligraphy モデル側にも $table = 'calligraphy'; の指定が必要になります。

 

4. Bookテーブルの作成

最後に、中心になる書籍(books)テーブルを作成します。
テーブルの関係は工程2に ER図 を載せていますので参照してください。

これまで同様、作成コマンドを Ubuntu ターミナルから実行します。

結果、モデルファイル(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メソッド 内を編集。

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 はマイグレーションファイルの作成日時順(ファイル名の先頭の日付)に実行するため、以下の順序になるようにファイルの日付を確認・調整するか、一度全て作り直す場合は全てのテーブルをドロップしてから実行してください。

  1. m_publishers / m_categories (マスタ)
  2. books (マスタを参照)
  3. authers / calligraphy / tags (booksを参照)

成功すると、データベース内にテーブルが出来上がります。

5-2-1. マイグレーションの実行記録

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

 

関連するポスト

タイトルとURLをコピーしました