データベース設定の確認
アプリケーションディレクトリー直下の.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