データベース設定の確認
アプリケーションディレクトリー直下の.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_modelsTestDiary→test_diariesCompanyPerson→CompanyPeopleWildGoos→WildGeesStockWater→StockWaters
なお、敢えてモデル名をスネークケースにすると、クラスファイル名、モデルクラス名もキャメルケースのままで、テーブル名は複数形になる。
test_model→test_models