データベース設定の確認
アプリケーションディレクトリー直下の.envファイルでデータベースの設定を確認する。DB_DATABASEに設定されたデータベースが作成済みでRDBMSでアクセス可能であることを確認する。
| 1 2 3 4 5 6 7 8 9 10 11 | [vagrant@localhost laravel_tutorial]$ cat .env ..... DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_test←データベース名 DB_USERNAME=root DB_PASSWORD=パスワード ..... | 
モデルの作成
モデル作成コマンド
モデルの作成には、artisanのmake:modelコマンドを使う。同時にデータベースを定義するマイグレーションファイルも作成するときは--migrationオプションを付ける。
php artisan make:model モデル名 --migration
モデル名の考え方は以下の通り。
- データベースのレコードに保存する対象として、単数の名詞とする
- モデル名はアッパー・キャメルケース(パスカルケース)で定義する
以下はTestModelというモデルを作成したケース。
| 1 2 3 | [vagrant@localhost laravel_tutorial]$ php artisan make:model TestModel --migration Model created successfully. Created Migration: 2021_08_23_093211_create_test_models_table | 
モデルの作成に成功したことと、2021_08_23…という名前でマイグレーションファイルが作成されたことが表示されている。
マイグレーションファイルの作成は--migrationオプションを付けたためで、これをつけないとモデルのだけが作成される。
モデルクラスファイル
モデルのクラスファイルはappディレクトリー下に作成される。コマンドで指定したモデル名に拡張子.phpが付けられている。
| 1 2 3 4 5 6 7 8 | [vagrant@localhost laravel_tutorial]$ ls -Al app 合計 8 drwxrwxr-x. 2 vagrant vagrant  24  8月 15 23:38 Console drwxrwxr-x. 2 vagrant vagrant  25  8月 15 23:38 Exceptions drwxrwxr-x. 4 vagrant vagrant  61  8月 15 23:38 Http drwxrwxr-x. 2 vagrant vagrant 167  8月 15 23:38 Providers -rw-rw-r--. 1 vagrant vagrant 105  8月 23 09:32 TestModel.php -rw-rw-r--. 1 vagrant vagrant 734  8月 15 23:38 User.php | 
以下がモデルクラスファイルの内容。
- 名前空間をAppとしている
- 名前空間Illuminate\Database\EloquentのModelファイルを利用する
- Modelファイルは- Modelクラスのファイル
- 今回作成したTestModelクラスはModelクラスを継承している
- モデル作成で定義した名前がそのままクラス名になっている
- 作成したクラスの中身は空
| 1 2 3 4 5 6 7 8 9 10 11 | [vagrant@localhost laravel_tutorial]$ cat app/TestModel.php <?php namespace App; use Illuminate\Database\Eloquent\Model; class TestModel extends Model {     // } | 
オプション指定
モデル作成コマンドのオプションは-h/--helpオプションで指定できる。
| 1 | php artisan make:model --help | 
主なオプションは以下の通り。
- -c/--controller
- コントローラーを作成する。
- -m/--migration
- マイグレーションファイルを作成する。
- -r/--resource
- リソースベースのアクションが含まれたコントローラーが生成される。ルーティングでのonly、exceptと関係なく、すべてのアクションが含まれる。
- -s/--seed
- シーダーファイルを作成する。
マイグレーションファイル
ファイル名
モデルクラスファイルと同時に作成されたマイグレーションファイルは、database/migrations下にある。新たに作成された2021_08_23...のマイグレーションファイルが確認できる。
マイグレーションファイルのファイル名構成は以下の通り。
日付_時刻_create_テーブル名_table.php
テーブル名はモデル名をスネークケースに変更し、複数形となっている。
| 1 2 3 4 5 6 | [vagrant@localhost laravel_tutorial]$ ls -Al database/migrations/ 合計 16 -rw-rw-r--. 1 vagrant vagrant 813  8月 15 23:38 2014_10_12_000000_create_users_table.php -rw-rw-r--. 1 vagrant vagrant 683  8月 15 23:38 2014_10_12_100000_create_password_resets_table.php -rw-rw-r--. 1 vagrant vagrant 789  8月 15 23:38 2019_08_19_000000_create_failed_jobs_table.php -rw-rw-r--. 1 vagrant vagrant 606  8月 23 09:32 2021_08_23_093211_create_test_models_table.php | 
マイグレーションファイルの内容は以下の通り。
up()メソッド
up()メソッドではテーブルを作成するときのカラム定義が記述されている。
- bigincrements()は- bigint unsigned型、- AUTO_INCREMENT設定のカラム- idを定義
- timestamps()は- timestamp型で- created_atと- updated_atの2つのカラムを定義
bigIncrements()によるIDを外部キーで参照する場合
bigIncrements()で生成されるカラムはbigint(unsigned)となる。他テーブルでこれを外部キーとして参照する場合のカラム型はbigint unsignedとする。マイグレーションファイルで指定する場合はunsignedBigInteger()とする。
down()メソッド
down()メソッドは、test_modelsテーブルが存在する場合にこれを削除(DROP)。
| 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 | [vagrant@localhost laravel_tutorial]$ cat database/migrations/2021_08_23_093211_create_test_models_table.php <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateTestModelsTable extends Migration {     /**      * Run the migrations.      *      * @return void      */     public function up()     {         Schema::create('test_models', function (Blueprint $table) {             $table->bigIncrements('id');             $table->timestamps();         });     }     /**      * Reverse the migrations.      *      * @return void      */     public function down()     {         Schema::dropIfExists('test_models');     } } | 
マイグレーション実行
状態確認
マイグレーション実行前のテーブルの状態。準備の時に作成したままになっている。
| 1 2 3 4 5 6 7 8 9 10 | mysql> SHOW TABLES; +------------------------+ | Tables_in_laravel_test | +------------------------+ | failed_jobs            | | migrations             | | password_resets        | | users                  | +------------------------+ 5 rows in set (0.00 sec) | 
マイグレーションの実行状態は以下のコマンドで確認。
php artisan migrate:status
今回作成されたマイグレーションファイルだけが未実行となっている。
| 1 2 3 4 5 6 7 8 9 | [vagrant@localhost laravel_tutorial]$ php artisan migrate:status +------+------------------------------------------------+-------+ | Ran? | Migration                                      | Batch | +------+------------------------------------------------+-------+ | Yes  | 2014_10_12_000000_create_users_table           | 1     | | Yes  | 2014_10_12_100000_create_password_resets_table | 1     | | Yes  | 2019_08_19_000000_create_failed_jobs_table     | 1     | | No   | 2021_08_23_093211_create_test_models_table     |       | +------+------------------------------------------------+-------+ | 
マイグレート
以下のコマンドで、マイグレーションファイルの設定に従ってテーブルを作成する。
php artisan migrate
| 1 2 3 | [vagrant@localhost laravel_tutorial]$ php artisan migrate Migrating: 2021_08_23_093211_create_test_models_table Migrated:  2021_08_23_093211_create_test_models_table (0.02 seconds) | 
マイグレーションの結果、データベースにテーブルが作成される。テーブル名はマイグレーションファイル名にもあるとおりで、以下のように付けられる。
- モデル名のキャメルケースをスネークケースに変更
- 複数形にする
| 1 2 3 4 5 6 7 8 9 | [vagrant@localhost laravel_tutorial]$ php artisan migrate:status +------+------------------------------------------------+-------+ | Ran? | Migration                                      | Batch | +------+------------------------------------------------+-------+ | Yes  | 2014_10_12_000000_create_users_table           | 1     | | Yes  | 2014_10_12_100000_create_password_resets_table | 1     | | Yes  | 2019_08_19_000000_create_failed_jobs_table     | 1     | | Yes  | 2021_08_23_093211_create_test_models_table     | 2     | +------+------------------------------------------------+-------+ | 
データベースでテーブルが作成されていることを確認。
| 1 2 3 4 5 6 7 8 9 10 11 | mysql> SHOW TABLES; +------------------------+ | Tables_in_laravel_test | +------------------------+ | failed_jobs            | | migrations             | | password_resets        | | test_models            | | users                  | +------------------------+ 5 rows in set (0.00 sec) | 
テーブル構造を確認。timestamp()によって、created_atとupdated_atの2つのカラムが作られている。
ただしtimestamp型は2038年問題が発生するため、datetime型に変更する方がよい。
| 1 2 3 4 5 6 7 8 9 | mysql> DESCRIBE test_models; +------------+-----------------+------+-----+---------+----------------+ | Field      | Type            | Null | Key | Default | Extra          | +------------+-----------------+------+-----+---------+----------------+ | id         | bigint unsigned | NO   | PRI | NULL    | auto_increment | | created_at | timestamp       | YES  |     | NULL    |                | | updated_at | timestamp       | YES  |     | NULL    |                | +------------+-----------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) | 
ロールバック
ロールバックにより、作成したテーブルを削除してマイグレーション前の状態に戻すことができる。
php artisan migrate:rollback
| 1 2 3 | [vagrant@localhost laravel_tutorial]$ php artisan migrate:rollback Rolling back: 2021_08_23_093211_create_test_models_table Rolled back:  2021_08_23_093211_create_test_models_table (0.01 seconds) | 
ロールバックを実行することで、ここまでで作成したtest_modelsテーブルが削除される。
| 1 2 3 4 5 6 7 8 9 10 | mysql> SHOW TABLES; +------------------------+ | Tables_in_laravel_test | +------------------------+ | failed_jobs            | | migrations             | | password_resets        | | users                  | +------------------------+ 4 rows in set (0.00 sec) | 
ただしマイグレーションファイルは残っていて、編集などを行った後に再度マイグレーションできる。
| 1 2 3 4 5 6 | [vagrant@localhost laravel_tutorial]$ ls -Al database/migrations/ 合計 16 -rw-rw-r--. 1 vagrant vagrant 813  8月 15 23:38 2014_10_12_000000_create_users_table.php -rw-rw-r--. 1 vagrant vagrant 683  8月 15 23:38 2014_10_12_100000_create_password_resets_table.php -rw-rw-r--. 1 vagrant vagrant 789  8月 15 23:38 2019_08_19_000000_create_failed_jobs_table.php -rw-rw-r--. 1 vagrant vagrant 606  8月 23 09:32 2021_08_23_093211_create_test_models_table.php | 
マイグレーションファイルの実行状態も未実行に戻る。
| 1 2 3 4 5 6 7 8 9 | [vagrant@localhost laravel_tutorial]$ php artisan migrate:status +------+------------------------------------------------+-------+ | Ran? | Migration                                      | Batch | +------+------------------------------------------------+-------+ | Yes  | 2014_10_12_000000_create_users_table           | 1     | | Yes  | 2014_10_12_100000_create_password_resets_table | 1     | | Yes  | 2019_08_19_000000_create_failed_jobs_table     | 1     | | No   | 2021_08_23_093211_create_test_models_table     |       | +------+------------------------------------------------+-------+ | 
マイグレーションファイルの編集とマイグレーション
test_modelsテーブルのカラムを以下のように編集する。
- idカラムはそのまま
- VARCHAR(20)で- product_nameカラムを追加
- int型で- amountカラムを追加
- created_atと- updated_atを- timestamp型から- datetime型に変更
参考:利用可能なカラムタイプ
マイグレーション前のファイルを以下のように編集してマイグレート。
| 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 | [vagrant@localhost laravel_tutorial]$ cat database/migrations/2021_08_23_093211_create_test_models_table.php <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateTestModelsTable extends Migration {     /**      * Run the migrations.      *      * @return void      */     public function up()     {         Schema::create('test_models', function (Blueprint $table) {             $table->bigIncrements('id');             $table->string('product_name', 20);             $table->integer('amount');             $table->datetime('created_at');             $table->datetime('updated_at');         });     }     /**      * Reverse the migrations.      *      * @return void      */     public function down()     {         Schema::dropIfExists('test_models');     } } | 
以下の構造のテーブルが作成される。
| 1 2 3 4 5 6 7 8 9 10 11 | mysql> DESCRIBE test_models; +--------------+-----------------+------+-----+---------+----------------+ | Field        | Type            | Null | Key | Default | Extra          | +--------------+-----------------+------+-----+---------+----------------+ | id           | bigint unsigned | NO   | PRI | NULL    | auto_increment | | product_name | varchar(20)     | NO   |     | NULL    |                | | amount       | int             | NO   |     | NULL    |                | | created_at   | datetime        | NO   |     | NULL    |                | | updated_at   | datetime        | NO   |     | NULL    |                | +--------------+-----------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec) | 
モデルの削除
モデルとテーブルを削除する手順は以下の通り。
- 該当テーブルのマイグレーションの前までロールバック
- マイグレーションファイル削除
- モデルファイル削除
timestampの2038年問題について
モデルとマイグレーションファイルを生成させると、自動的にtimestampsが設定されるが、MySQLとの組み合わせの場合に2038年問題が発生する。datetime型で書きなおすなどの対応をしておくべき。
モデル名とテーブル名について
モデルとテーブルを生成するときの命名の流れは以下のようになっている。
- モデル名は単数形でアッパーキャメルケース
- モデルクラスファイル名はモデル名に.phpの拡張子
- モデルクラス名はモデル名と同じ
- テーブル名はキャメルケースからスネークケースに変換され、複数形になる
複数形への変更はLaravelがエレガントにやってくれて、不規則な複数形にも対応している。ただし不可算名詞にはそのままsが付くようだ。
- TestModel→- test_models
- TestDiary→test_diaries
- CompanyPerson→- CompanyPeople
- WildGoos→- WildGees
- StockWater→- StockWaters
なお、敢えてモデル名をスネークケースにすると、クラスファイル名、モデルクラス名もキャメルケースのままで、テーブル名は複数形になる。
- test_model→- test_models