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
コマンドでマイグレーションを実行する