LoginSignup
1
1

migration とは

データベースの作成や編集、削除などをバージョン管理する方法として、Laravelには「migration (マイグレーション)」というものが備わっています。
だれが、いつ、どういった目的でテーブルの作成・編集・削除を行ったのかがわかる優れものです。

本 wiki の目標

・データベースのバージョン管理方法である migration について知ること。

・テーブルの追加、編集、削除を行えるようにすること。

・migration ファイルの命名規則を HUB3 内で統一すること。

・artisan migrate と artisan migrate:refresh と artisan migrate:fresh の違いを理解すること。

新規作成時

例として下記のような tests テーブルを新規作成する。

物理名 論理名 主キー unique null データ型 デフォルト値
id ID bigint
name 名前 varchar
status 表示状況 int 0
user_id ユーザー識別ID bigint
remark 備考 varchar
created_at 作成日時 timestamp
updated_at 更新日時 timestamp

※注意
一度実行された migration ファイルは基本的に再度実行されないため、テーブル内容の編集時には後述のやり方を参考すること。

手順

  1. マイグレーションファイルの作成
  2. マイグレーションファイルの編集
  3. マイグレーションの実行

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

sail artisan make:migration create_tests_table

成功すれば database/migrations ディレクトリ内に現在日時_create_tests_table.phpが作成されます。

2. マイグレーションファイルの編集

上記コマンド実行後に下記のようにファイルが作成されます。

<?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('tests', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

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

「up」内にはテーブル作成時の処理、「down」内にはテーブル削除時の処理を書きます。( ※ロールバック処理の時に「down」が呼び出されるため )

下記が追加した後の内容です。

<?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('tests', function (Blueprint $table) {
            $table->id();
            $table->string('name')->unique()->comment('名前');
            $table->integer('status')->default(0)->comment('表示状況');
            $table->bigInteger('user_id')->comment('ユーザー識別ID');
            $table->string('remark')->comment('備考')->nullable();
            $table->timestamps();
        });
    }

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

id については $table->id();にて自動増分 ( Auto Increment ) の id カラムが作成され、主キーと認識されます。

created_at, updated_at については $table->timestamps(); にてどちらも追加されます。

わかりやすいように ->commnet('論理名') を必ずつけましょう。

データ型、カラム修飾子参考 https://qiita.com/Takahiro_Nago/items/51eb0e9f1c8bbc2c9852

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

sail artisan migrate

こちらを実行で env に接続された DB へ新規テーブルが作成されます!

設計の内容と相違なければ完了です。

カラム編集時

例として tests テーブルから text カラム ( 本文 ) を追加し、

既存カラムに対しても更新を行う

status のデータ型を varchar に変更

user_id を unique を設定

remark のカラム名を remark_update に変更

物理名 論理名 主キー unique null データ型 デフォルト値
id ID bigint
name 名前 varchar
status 表示状況 varchar 0
user_id ユーザー識別ID bigint
remark_update 備考 varchar
created_at 作成日時 timestamp
updated_at 更新日時 timestamp

手順

手順自体は新規作成時と変わりませんが、ファイルの命名、「down」の処理内容に修正が必要なためそちらのみ記載します。

  1. マイグレーションファイルの作成
  2. マイグレーションファイルの編集
  3. マイグレーションの実行

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

カラム追加・更新 sail artisan make:migration modify_tests_table --table=tests

カラム削除 sail artisan make:migration remove_column_from_tests_table --table=tests

2. マイグレーションファイルの編集

作成ファイルに対し、追加の場合は下記のように記載します。

「up」内にはテーブルに対しての処理、「down」内には「up」の処理内容を打ち消す処理を書きます。

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('tests', function (Blueprint $table) {
            // textカラムの追加
            $table->string('text')->comment('本文')->nullable();

            // 既存カラムの更新
            $table->string('status')->comment('表示状況')->change();
            $table->bigInteger('user_id')->comment('ユーザー識別ID')->unique()->change();
            $table->renameColumn('remark', 'remark_update');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('tests', function (Blueprint $table) {
            // textカラムの削除
            $table->dropColumn('text');

            // 既存カラムを戻す
            $table->integer('status')->comment('表示状況')->change();
            $table->bigInteger('user_id')->comment('ユーザー識別ID')->unique(false)->change();
            $table->renameColumn('remark_update', 'remark')->change();
        });
    }
};

カラム更新についてはこちらを参考にしました。https://qiita.com/mdrq/items/f10e488caa4497eec79b

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

sail artisan migrate

カラムが編集、追加されていれば完了です!

よく使うコマンド

sail artisan migrate

migration ファイルの up の処理を実行し、テーブルの作成を行います。

一度実行したファイルは実行されません。

sail artisan migrate:refresh

migrations ファイルの down の処理を実行しロールバックを行った後に migrations ファイルの up の処理を実行し、テーブルの作成を行います。

一度実行したファイルも実行されますが、ロールバックされたテーブルのデータはリセットされます。

sail artisan migrate:fresh

テーブルを削除した後に migrations ファイルの up の処理を実行し、テーブルの作成を行います。

down は実行されず、migrations にて管理されていないテーブルも削除されます。

sail artisan migrate:rollback

migrations ファイルの down の処理を実行しロールバックする

sail artisan migrate:rollback --step=1

migrations ファイルの最新の 1 件をロールバックする

数字部分を変えることで何件ロールバックするか変更することができます。

新しく migration ファイルを作成した際に down の記述ができているか確認が行えます。

トラブルシューティング

$table->increments('id');$table->id(); は何が違うの?

$table->increments('id'); は古いバージョンの Laravel で使用されていた方法で新しいバージョン(5.8以降)では非推奨とされています。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1