Laravel – モデル作成とマイグレーション

データベース設定の確認

アプリケーションディレクトリー直下の.envファイルでデータベースの設定を確認する。DB_DATABASEに設定されたデータベースが作成済みでRDBMSでアクセス可能であることを確認する。

モデルの作成

モデル作成コマンド

モデルの作成には、artisanmake:modelコマンドを使う。同時にデータベースを定義するマイグレーションファイルも作成するときは--migrationオプションを付ける。

php artisan make:model モデル名 --migration

モデル名の考え方は以下の通り。

  • データベースのレコードに保存する対象として、単数の名詞とする
  • モデル名はアッパー・キャメルケース(パスカルケース)で定義する

以下はTestModelというモデルを作成したケース。

モデルの作成に成功したことと、2021_08_23…という名前でマイグレーションファイルが作成されたことが表示されている。

マイグレーションファイルの作成は--migrationオプションを付けたためで、これをつけないとモデルのだけが作成される。

モデルクラスファイル

モデルのクラスファイルはappディレクトリー下に作成される。コマンドで指定したモデル名に拡張子.phpが付けられている。

以下がモデルクラスファイルの内容。

  • 名前空間をAppとしている
  • 名前空間Illuminate\Database\EloquentModelファイルを利用する
  • ModelファイルはModelクラスのファイル
  • 今回作成したTestModelクラスはModelクラスを継承している
  • モデル作成で定義した名前がそのままクラス名になっている
  • 作成したクラスの中身は空

オプション指定

モデル作成コマンドのオプションは-h/--helpオプションで指定できる。

主なオプションは以下の通り。

-c/--controller
コントローラーを作成する。
-m/--migration
マイグレーションファイルを作成する。
-r/--resource
リソースベースのアクションが含まれたコントローラーが生成される。ルーティングでのonlyexceptと関係なく、すべてのアクションが含まれる。
-s/--seed
シーダーファイルを作成する。

マイグレーションファイル

ファイル名

モデルクラスファイルと同時に作成されたマイグレーションファイルは、database/migrations下にある。新たに作成された2021_08_23...のマイグレーションファイルが確認できる。

マイグレーションファイルのファイル名構成は以下の通り。

日付_時刻_create_テーブル名_table.php

テーブル名はモデル名をスネークケースに変更し、複数形となっている。

マイグレーションファイルの内容は以下の通り。

up()メソッド

up()メソッドではテーブルを作成するときのカラム定義が記述されている。

  • bigincrements()bigint unsigned型、AUTO_INCREMENT設定のカラムidを定義
  • timestamps()timestamp型でcreated_atupdated_atの2つのカラムを定義

bigIncrements()によるIDを外部キーで参照する場合

bigIncrements()で生成されるカラムはbigint(unsigned)となる。他テーブルでこれを外部キーとして参照する場合のカラム型はbigint unsignedとする。マイグレーションファイルで指定する場合はunsignedBigInteger()とする。

down()メソッド

down()メソッドは、test_modelsテーブルが存在する場合にこれを削除(DROP)。

マイグレーション実行

マイグレーションコマンドについてはこちらを参照。

状態確認

マイグレーション実行前のテーブルの状態。準備の時に作成したままになっている。

マイグレーションの実行状態は以下のコマンドで確認。

php artisan migrate:status

今回作成されたマイグレーションファイルだけが未実行となっている。

マイグレート

以下のコマンドで、マイグレーションファイルの設定に従ってテーブルを作成する。

php artisan migrate

マイグレーションの結果、データベースにテーブルが作成される。テーブル名はマイグレーションファイル名にもあるとおりで、以下のように付けられる。

  • モデル名のキャメルケースをスネークケースに変更
  • 複数形にする

データベースでテーブルが作成されていることを確認。

テーブル構造を確認。timestamp()によって、created_atupdated_atの2つのカラムが作られている。

ただしtimestamp型は2038年問題が発生するため、datetime型に変更する方がよい。

ロールバック

ロールバックにより、作成したテーブルを削除してマイグレーション前の状態に戻すことができる。

php artisan migrate:rollback

ロールバックを実行することで、ここまでで作成したtest_modelsテーブルが削除される。

ただしマイグレーションファイルは残っていて、編集などを行った後に再度マイグレーションできる。

マイグレーションファイルの実行状態も未実行に戻る。

マイグレーションファイルの編集とマイグレーション

test_modelsテーブルのカラムを以下のように編集する。

  • idカラムはそのまま
  • VARCHAR(20)product_nameカラムを追加
  • int型でamountカラムを追加
  • created_atupdated_attimestamp型からdatetime型に変更

参考:利用可能なカラムタイプ

マイグレーション前のファイルを以下のように編集してマイグレート。

以下の構造のテーブルが作成される。

モデルの削除

モデルとテーブルを削除する手順は以下の通り。

  1. 該当テーブルのマイグレーションの前までロールバック
  2. マイグレーションファイル削除
  3. モデルファイル削除

timestampの2038年問題について

モデルとマイグレーションファイルを生成させると、自動的にtimestampsが設定されるが、MySQLとの組み合わせの場合に2038年問題が発生する。datetime型で書きなおすなどの対応をしておくべき。

モデル名とテーブル名について

モデルとテーブルを生成するときの命名の流れは以下のようになっている。

  • モデル名は単数形でアッパーキャメルケース
  • モデルクラスファイル名はモデル名に.phpの拡張子
  • モデルクラス名はモデル名と同じ
  • テーブル名はキャメルケースからスネークケースに変換され、複数形になる

複数形への変更はLaravelがエレガントにやってくれて、不規則な複数形にも対応している。ただし不可算名詞にはそのままsが付くようだ。

  • TestModeltest_models
  • TestDiary→test_diaries
  • CompanyPersonCompanyPeople
  • WildGoosWildGees
  • StockWaterStockWaters

なお、敢えてモデル名をスネークケースにすると、クラスファイル名、モデルクラス名もキャメルケースのままで、テーブル名は複数形になる。

  • test_modeltest_models

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です