【Laravel】マイグレーションとは(migration):テーブル作成について

2023.09.20 /

【Laravel】マイグレーションとは(migration):テーブル作成について

記事ではPHPフレームワークのLaravelにおける、アプリケーション作成で重要な機能の1つであるマイグレーションについて詳しく解説していきます。

マイグレーションとはテーブル作成やカラムの追加・変更などデータベース操作で利用されるツールです。

アプリケーションではデータベースのスキーマ管理は非常に重要な要素です。本記事を通して、Laravelにおけるマイグレーションについて理解を深めてください。

データベースのテーブル・カラムとは

データベースとは大量の「データ」を蓄積し、いつでも・好きなときに・簡単にデータを利用可能なシステムです。あなたがシステムを開発する際、データベースはそのシステムの中核を担います。

データベースではすべてのデータが「テーブル」に保存されます。データベースには複数のテーブルがあり、テーブルはカラム(列またはフィールド)とロウ(行またはレコード)からなる、Excelのような二次元表です。図に表すと次のようになります。

リレーショナルデータベースの構造

テーブルに保存されるデータ例を以下に記します。

名前 性別 年齢 好きなプログラミング言語
OFFICE 45 Python
FiveFour 54 Larabel

データベースはExcelと似た印象を持ちますが、処理できるデータ量やテーブルの連結など、Excelではできない多くのことができます。

関連リンク:データベースとは?機能と特徴(SQLite、MySQL、TinyDB)

マイグレーション(migration)とは

マイグレーションとはデータベースのスキーマ(構造)を管理するための機能です。データベーススキーマをコードで表現し、それをデータベースに反映することができます。

わかりやすく言うと、マイグレーションはテーブル作成や定義変更(カラムの変更・追加・削除など)を管理する機能ということです。

またデータベーススキーマのバージョン管理が行え、データベースを過去どのように変更したか履歴を記録します。

IT用語の確認

データベースのスキーマとはデータベースの構造を意味します。「データベースの設計図」と考えるとわかりやすいです

マイグレーションではマイグレーションファイルというテーブルの構造を定義したファイルを作成します。マイグレーションファイルには新しいテーブルの作成やカラムの追加・変更・削除といった操作を記述します。

マイグレーションファイルはテーブルの設計図と考えるとイメージしやすいと思います。

マイグレーションファイルを作成後、「マイグレーションの実行」をすることでマイグレーションファイルに定義したテーブル構造がデータベースに反映されます。つまり新しいテーブルが作成される、カラムが追加・変更されるなどの操作が実行されるということです。

マイグレーションの特徴

Laravelのマイグレーションには次のような特徴があります。

マイグレーションの特徴
  • バージョン管理と履歴管理
  • すべてのデータベースシステムで利用可能
  • ロールバックが簡単
  • データベーススキーマの可読性が高い
  • ファイルの共有によりチーム全員が同一テーブルを作成できる
  • 学習コストが若干高い

バージョン管理と履歴管理

マイグレーションはデータベース構造のバージョン管理をサポートします。データベースのテーブル作成やカラムの追加・変更・削除といった変更履歴を記録・管理します。

SQLでテーブル作成を行った場合、なにも記録は残りませんが、マイグレーションではファイルが残るため履歴管理やこの後説明するロールバックなどを可能にしています。

すべてのデータベースシステムで利用可能

Laravelのマイグレーションはすべてのデータベース(MySQLやSQLite、PostgreSQL、SQL Serverなど)で利用できます。

データベース環境によりコードを変更する必要がありません。

ロールバックが簡単

マイグレーションファイルを作成すると、ロールバックするためのメソッドが自動的に追加されます。そのためロールバックコマンドを実行するだけで簡単にロールバックが可能です。

IT用語の確認

ロールバックとはデータベース操作で利用される技術であり、トランザクション処理でデータ更新中などでエラーが発生した際に処理前の状態(なにもなかった状態)に戻すことです

ロールバックを実行すると実行していたマイグレーションは保留状態に戻るため、再度マイグレーションを実行することもできます。

データベーススキーマの可読性が高い

マイグレーションのコードはPHPで記述されており読みやすく、データベーススキーマについてわかりやすいコードで表されています。そのため可読性が高く、一目で理解できるようになっています。

データベーススキーマの変更に関してもマイグレーションファイル内のコードで表現されているため、ファイルの中身を見ることで明確になります。

ファイルの共有によりチーム全員が同一テーブルを作成できる

マイグレーションファイルをチーム内で共有し、各人がマイグレーションを実行することで簡単に全員が同じテーブルを持つデータベースを作成することができます。

学習コストが若干高い

マイグレーションについて完全に理解するには多少の時間がかかります。初めてフレームワークによる開発を行う方にとっては学習コストがかかる傾向があります。

マイグレーションを実行するまでの流れ

マイグレーションを実行してデータベースにテーブルを作成するまでの流れは以下の通りです。

マイグレーションを実行してテーブルを作成するまでの流れ
  1. マイグレーションファイルの作成
  2. マイグレーションファイルの編集:テーブル定義
  3. マイグレーションの実行

ここではすでにLaravelが利用できる環境が構築されており、データベースの接続も完了していることを前提として解説していきます。まだの方は以下記事を参考に環境構築を進めてください。

1.マイグレーションファイルの作成

まず始めにマイグレーションファイルを作成します。マイグレーションファイルはテーブルの作成やカラムの追加・変更・削除といった操作を行う際に作成します。

ここでは新規でテーブルを作成するためのマイグレーションファイルを作成していきます。マイグレーションファイルの作成には以下構文に沿ったartisanコマンドを実行します。

構文

php artisan make:migration ファイル名

指定するファイル名はスネークケース(単語をアンダーラインで繋ぐ)を使った「create_XXX_table」とすることでテーブルを新規追加するための記述が追加された状態でマイグレーションファイルが作成されます。

ここではbooksテーブルを作成するので次のようにコマンドを記述して実行します。

php artisan make:migration create_books_table

上記コマンドを実行すると「database/migrations」フォルダにマイグレーションファイルが作成されます。ファイル名は「yyyy_mm_dd_xxxxx_create_books_table.php」です。

マイグレーションファイルの中身は次のようになっています。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('books', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('books');
    }
};

マイグレーションファイルの中にはupメソッドとdownメソッドがあるのがわかります。upメソッドでは新規に追加するテーブル定義や定義変更するカラムのスキーマを指定します。downメソッドにはupメソッドとは逆に戻す処理を指定します。

2.マイグレーションファイルの編集:テーブル定義

マイグレーションファイルでは「スキーマビルダ」という仕組みでテーブルの作成・編集を記述します。スキーマビルダはSchemaファザードで記述します。

upメソッドの中にはSchema::createメソッドが記述され、第一引数にはテーブル名、第二引数にはクロシージャが指定されています。テーブルを作成する際はこのSchema::create内にテーブル定義を記述していきます。

booksテーブルを作成するために次のようにマイグレーションファイルに追記します。

public function up(): void
{
    Schema::create('books', function (Blueprint $table) {
        $table->id();
        $table->string('name','200');    // 追記
        $table->string('author_name','100');    // 追記
        $table->integer('price');    // 追記
        $table->timestamps();
    });
}

上記ではテーブルのカラムとしてid、name、author_name、price、timestampsを定義しています。timestampsはデータ登録日時(created_at)と更新日時(updated_at)をカラムに追加します。

スキーマビルダで生成できるカラムタイプについて代表的なものを以下に記します。

カラムタイプ スキーマビルダ
ID(主キー) $table->id();
BOOLEAN型 $table->boolean(カラム名);
VARCHAR型 $table->string(カラム名);
CHAR型 $table->char(カラム名, サイズ);
TEXT型 $table->text(カラム名);
INTEGER型 $table->integer(カラム名);
FLOAT型 $table->float(カラム名, 最大桁数, 小数点の桁数);
DOUBLE型 $table->double(カラム名, 最大桁数, 小数点の桁数);
DATE型 $table->date(カラム名);
DATETIME型 $table->dateTime(カラム名);

関連する複数のテーブルを関連付けて利用する場合は外部キー制約を使用する必要があります。マイグレーションで外部キー制約を作成する方法は以下記事をご参照ください。

3.マイグレーションの実行

マイグレーションファイルにテーブル定義を記入したら、マイグレーションを実行します。マイグレーションの実行にはartisanのmigrateコマンドを実行します。

php artisan migrate

上記コマンドを実行することで、「database/migrations」内のまだデータベースに反映されていないマイグレーションファイルを一括で反映させます。

マイグレーションファイルの注意点

実行されたマイグレーションファイルの中身を変更しても再度実行されることはありません。マイグレーションが実行されたファイルはmigrationsテーブルで実行済と認識されているためです。もし同じファイルを利用したい場合はファイル名をリネームするなどが必要になります

マイグレーションの状態を確認したい場合は以下コマンドを実行します。

php artisan migrate:status

実行すると以下のように現在のマイグレーションの状態が表示されます。実行済みのファイルはSTATUSがRANとなります。

  Migration name ...................................................................................... Batch / Status
  2014_10_12_000000_create_users_table ....................................................................... [1] Ran
  2014_10_12_100000_create_password_reset_tokens_table ....................................................... [1] Ran
  2019_08_19_000000_create_failed_jobs_table ................................................................. [1] Ran
  2019_12_14_000001_create_personal_access_tokens_table ...................................................... [1] Ran

マイグレーションのコマンド

migrate:rollbackコマンド:ロールバック

データベースをロールバック(実行前の状態に戻す)する場合は、以下ロールバックのコマンドを実行します。

php artisan migrate:rollback

Laravelのマイグレーション機能ではマイグレーションの実行状態をmigrationsテーブルで管理しているため、上記のようなロールバックなどを可能にしています。

データベースで以下SQLを実行するとmigrationsテーブルの中身が確認できますので、ぜひ確認してみてください。

mysql> select * from migrations;

migrate:resetコマンド

すべてのマイグレーションをすべて元に戻したい場合は以下リセットコマンドを実行してください。

php artisan migrate:reset

migrate:refreshコマンド

「migrate:refresh」コマンドはマイグレーションをすべて取り消して、再度一からマイグレーションを実行します。

php artisan migrate:refresh
注意点

このコマンドを実行すると、現時点でデータベースに保存されているデータも削除されます。必要なデータがある場合は、バックアップを取ってからコマンドを実行するようにしましょう

まとめ

本記事「【Laravel】マイグレーションとは(migration):テーブル作成について」はいかがでしたか。

アプリケーション開発においてテーブル作成は非常に重要なポイントです。マイグレーションについて理解を深めて、希望するテーブルを定義できるようになりましょう。