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