Laravel5.8でMigrationを行う

Dockerの調子が悪くて・・・

最近Dockerの調子が悪く、何度かFactory Resetを繰り返し行っていました
で、Factory Resetの度にコンテナやらイメージやらボリュームやらが全部リセットとなり
結果、DBのデータやテーブル構造なども失われていたわけです

今まではMySql Workbench上から作り直していたのですが、さすがに何度も続くとめんどくさくなってきたので Laravelに組み込まれている「Migration」という機能を利用してDB管理を行うことにしました

そもそもMigrationとは?

Migration(マイグレーション)とは、「データベースの管理をコードで行える仕組みのこと」と、自分は解釈しています

実際にやってみる

公式マニュアルはこちら
https://readouble.com/laravel/5.8/ja/migrations.html

LaravelでMigrationを行うには以下の通り

Laravelプロジェクトに移動し、以下のコマンドを実行

php artisan make:migration loto7

上記のコマンドを実行すると、以下のディレクトリにファイルが作成されます

(Laravelプロジェクトフォルダ)\database\migrations\2019_03_31_085703_loto7.php

中を見ると、 updown の2つのメソッドが準備されています

up : 新規テーブルやカラムの作成
down : up時の操作を戻す

という役割があります

基本的に up にはcreate table などを記述し、 down には drop tableなどを記述することになるかと思います

実際に記述してみる

今回は宝くじ情報のサイトを作る想定でいるので、その情報を保存できるようにテーブルを作成します

<?php

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

class Loto7 extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('loto7', function (Blueprint $table) {
            $table->increments('holding_count');
            $table->unsignedInteger('holding_date');
            $table->timestamps();
        });

        Schema::create('loto7_winning_numbers', function (Blueprint $table) {
            $table->increments('holding_count');
            $table->unsignedInteger('number');
            $table->timestamps();
        });

        Schema::create('loto7_bonus_numbers', function (Blueprint $table) {
            $table->increments('holding_count');
            $table->unsignedInteger('number');
            $table->timestamps();
        });

        Schema::create('loto7_winning_count', function (Blueprint $table) {
            $table->increments('holding_count');
            $table->unsignedInteger('1st');
            $table->unsignedInteger('2nd');
            $table->unsignedInteger('3rd');
            $table->unsignedInteger('4th');
            $table->unsignedInteger('5th');
            $table->unsignedInteger('6th');
            $table->timestamps();
        });

        Schema::create('loto7_winning_money', function (Blueprint $table) {
            $table->increments('holding_count');
            $table->unsignedInteger('1st');
            $table->unsignedInteger('2nd');
            $table->unsignedInteger('3rd');
            $table->unsignedInteger('4th');
            $table->unsignedInteger('5th');
            $table->unsignedInteger('6th');
            $table->timestamps();
        });

        Schema::create('loto7_carryover', function (Blueprint $table) {
            $table->increments('holding_count');
            $table->unsignedBigInteger('carry_over');
            $table->timestamps();
        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('loto7');
        Schema::drop('loto7_winning_numbers');
        Schema::drop('loto7_bonus_numbers');
        Schema::drop('loto7_winning_count');
        Schema::drop('loto7_winning_money');
        Schema::drop('loto7_carryover');
    }
}

こんな感じの内容で作ってみました

マイグレーションを実行する

artisanコマンドを実行すれば、先ほど作成したファイルの内容が実行され、テーブル類が作成されます
気を付けるのはLaravelプロジェクトの.envファイルの設定で、このファイルに書かれているDBの接続設定が使用されます

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=lottery
DB_USERNAME=root
DB_PASSWORD=root

今回、.envファイルはDockerネットワーク内で実行される想定で作ったので、Laradockのworkspaceからマイグレーションを実行します
ちなみに、ホストから実行する場合は.envファイルを

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=lottery
DB_USERNAME=default
DB_PASSWORD=default

のように変更する必要があります

また、マイグレーションを実行するとき、 information_schemaへのアクセスが可能なユーザーで行う必要があるようで、自分の環境では以下のエラーが発生しました

そのため、設定ファイルでrootユーザーを指定し、実行しています

Docker workspaceへ

PortainerというDocker管理ツールを利用し、Laradockのワークスペースに入りました
ここでマイグレーションを実行します

php artisan migrate

これでマイグレーションが実行されます

成功すると、このようなログが出力されます

MySQL Workbenchで確認すると、きちんとテーブルが出来ていますね

以上です

これでマイグレーションの紹介は以上です
DBをコードで管理できるので、元に戻したり、環境の作り直しも簡単に行えそうですね
ただ、簡単にdropもできてしまうため、本番運用では気を使いそうです