Laravel - 9. マイグレーション
ここからはデータベースとのやりとりについて学習していきます。Laravelはデータベースのマイグレーションをサポートしています。マイグレーションとはデータベースのバージョン管理のようなもので、CREATE TABLE文によるテーブル定義の作成やALTER TABLE文によるテーブル定義の変更を反映したり、差し戻したりする機能です。

Laravelのマイグレーションは、SQLを直接記述するのではなくPHPプログラムによってデータベース定義の更新プログラムを作成します。マイグレーションファイルを作成するには php artisan make:migration コマンドを使います。
$ php artisan make:migration マイグレーション名
上記のようにマイグレーション名を指定してマイグレーションファイルを作成します。
messagesテーブルの作成
ここでは次のようなカラムを持つ messages テーブルを作成します。
| 列名(論理) | 列名(物理) | データ型 | 制約 |
|---|---|---|---|
| ID | id | bigint | primary key, auto increment |
| 内容 | text | string | not null |
| 更新日時 | updated_at | timestamp | |
| 作成日時 | created_at | timestamp |
マイグレーション名には任意の名前を付けることができますが create_messages_table のようにSQLによる操作内容と対象のテーブルを明記しておくとわかりやすいでしょう。それではコマンドラインからマイグレーションファイルを作成してみましょう。
$ php artisan make:migration create_messages_table
Created Migration: 2020_09_01_071916_create_messages_table
php artisan make:migration コマンドによって database/migrations/ フォルダ下に 2020_09_01_071916_create_messages_table.php ファイルが生成されます。このように生成されたマイグレーションファイルには 2020_09_01_071916_ のように現在日時が付与されます。
続いてマイグレーションファイル( database/migrations/2020_09_01_071916_create_messages_table.php )をテキストエディタで開いてみましょう。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateMessagesTable extends Migration
{
public function up()
{
Schema::create('messages', function (Blueprint $table) {
$table->bigIncrements('id');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('messages');
}
}
Migration クラスを継承した CreateMessagesTable クラスを確認できます。 CreateMessagesTable クラスには up メソッドと down メソッドの2つが定義されています。 up メソッドはデータベースの通常のマイグレーション(バージョンアップ)時に実行されるメソッドです。一方の down メソッドはデータベース定義を以前の状態に差し戻す(バージョンダウン)する際に実行されるメソッドです。今回のようなテーブルを作成するマイグレーションファイルにおいては up メソッドの中でテーブルを新規作成するプログラムを記述し、 down メソッドで作成したテーブルを削除するプログラムを記述します。
続いて up メソッドの詳細を見てみましょう。
public function up()
{
Schema::create('messages', function (Blueprint $table) {
$table->bigIncrements('id');
$table->timestamps();
});
}
ここでは Schema::create メソッドを使って接続先のデータベースにテーブルを作成しています。 create メソッドは第1引数にテーブル名、第2引数に無名関数を受け取ります。この無名関数の引数である $table 変数を操作することでテーブルに必要な列を定義できます。 $table->bigIncrements('id'); メソッドの呼び出しは符号なしの bigint 型の id 列を定義しており、その値はAUTO INCREMENTされるようになります。 $table->timestamps(); メソッドの呼び出しは、テーブルのメタ情報としてレコードの作成日時を表す created_at 列、更新日時を表す updated_at 列の2つを追加します。
続いて down メソッドです。
public function down()
{
Schema::dropIfExists('messages');
}
ここでは Schema::dropIfExists メソッドによって messages テーブルが存在する場合は削除するように指示しています。 down メソッドはデータベースのバージョンをダウンするときに呼び出されるようになっているので、 後で実行するマイグレーションコマンドによって messages テーブルを簡単に削除できるようになります。
それでは messages テーブルの定義を完成させるために up メソッドを修正してみましょう。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateMessagesTable extends Migration
{
public function up()
{
Schema::create('messages', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('text');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('messages');
}
}
ここでは up メソッドの処理の中に $table->string('text'); を追記しています。これによって messages テーブルに文字列型の text 列が追加されます。以上でマイグレーションファイルの作成は完了です。
Schemaクラスもstaticなメソッドを持つファサードクラスです。このような様々なファサードクラスを使うこともLaravelの特徴と言えます。
マイグレーションの実行
作成したマイグレーションファイルを実行するには php artisan migrate コマンドを使います。コマンドラインから実際に入力してみましょう。
$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.06 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (0.04 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.02 seconds)
Migrating: 2020_09_01_071916_create_messages_table
Migrated: 2020_09_01_071916_create_messages_table (0.02 seconds)
実行結果をよく見ると、デフォルトで用意されている 2014_10_12_000000_create_users_table ファイルや 2014_10_12_100000_create_password_resets_table などのマイグレーションファイルも合わせて実行されているのがわかります。これらのテーブルは現時点では必要ありません。そのままにしておきましょう。また実行結果の最後の出力に 2020_09_01_071916_create_messages_table の実行が完了した様子を確認できます。
マイグレーション結果の確認
php artisan migrate:status コマンドを実行すると、マイグレーション結果を確認できます。
$ 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 | 2020_09_01_071916_create_messages_table | 1 |
+------+------------------------------------------------+-------+
上記の結果から4つのマイグレーションファイルが実行されていることがわかります。
マイグレーション結果の確認(データベース)
実際にデータベースに接続して messages テーブルの定義を確認してみましょう。ここではPostgreSQLのクライアントツールを起動して以下のようにコマンドを入力します。
laravel=# \d messages
Table "public.messages"
Column | Type | Collation | Nullable | Default
------------+--------------------------------+-----------+----------+--------------------------------------
id | bigint | | not null | nextval('messages_id_seq'::regclass)
text | character varying(255) | | not null |
created_at | timestamp(0) without time zone | | |
updated_at | timestamp(0) without time zone | | |
Indexes:
"messages_pkey" PRIMARY KEY, btree (id)
まとめ
- データベース定義をバージョン管理する仕組み
php artisan make:migrationコマンドでマイグレーションファイルを作成するphp artisan migrateコマンドでマイグレーションを実行する