プログラミング学習やフリーランスエンジニア情報を発信していきます。現役フリーランスエンジニア2人で運営してます!

  1. バックエンド

Laravelのマイグレーションを理解して使ってみよう!

最終更新日:2019/04/02

本記事では、Laravelのマイグレーションとは何かをわかりやすく解説します。

以下の記事の続きです。まだ読んでいない方はぜひご一読ください!

初心者の方でもLaravelの動作環境を簡単に作れるWINDIIオリジナルのソースコードを用意したので、実際に動かして学ぶとより深く理解できるようになります!

以下の記事を参考にご活用ください。

Laravelのマイグレーション(migration)ってなに?

マイグレーションとは、データベースの構造をバージョン管理できる機能です。

上の図のような3人のチームで開発しているとします。

誰かが実装上の都合でデータベース構造(スキーマと呼ばれます)を変更したくなったとき、マイグレーションファイル を記述します。
このマイグレーションファイルにはデータベースの構造をどうやって変更するかが書かれています。
このマイグレーションファイルを他のチームメンバーに共有して、そのチームメンバーがマイグレーションを実行するためのコマンドを打つだけで、データベース構造が共有できます。

まだチーム開発を経験したことない人ですと、マイグレーションの良さがイマイチぴんと来ないかもしれませんが、絶対に必要になるのでしっかり覚えていきましょう!

データベースをみてみる

マイグレーションを学ぶにはデータベースをみられるようにする必要があります。

WINDIIのスターターキットを使用している方はhttp://localhost:8080 を開いてみましょう!

こんな感じでphpMyAdminが表示されていると思います。

example というデータベースをクリックすると以下のような感じで3つテーブルが作成されているはずです。

ここに新たなテーブルを追加していくのがゴールです!

マイグレーションファイルを作成してみる

マイグレーションについてざっくり理解したところで、実際にマイグレーションファイルを作って理解を深めていきましょう。

まずはartisanコマンドでマイグレーションファイルを作成します。

以下のコマンドを実行した後、

docker-compose exec app bash

以下のコマンドでマイグレーションファイルを作成します。

php artisan make:migration create_posts_table

すると、 database/migrations/XXXX_create_posts_table.php  が作成されます。

中身を見てみましょう。以下のような感じになっていると思います。

<?php

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

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

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

up() と down() が記述されているのがわかります。

up() にはデータベース構造の変更を記述し、down() には元にもどす処理を記述します。

(要するにデータベースのバージョンアップとバージョンダウンの処理を記述すれば良いというわけです。)

それではさっそく記述していきます!

タイトルと本文を持ったブログを保存するテーブルを作りたいので以下のようにします。

public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title'); // タイトル
            $table->string('content'); // 本文
            $table->timestamps();
        });
    }

書き上げたら以下のコマンドを実行してみましょう。

php artisan migrate

以下のようなメッセージが出るはずです。(日付は実行した時によって違います)

Migrating: 2019_03_16_135036_create_posts_table
Migrated:  2019_03_16_135036_create_posts_table

phpMyAdminをみてみましょう。以下のようにpostsデーブルが追加されているはずです!

postsテーブルの中身を見てみましょう。

titlecontent をカラムに持っているのがわかりますね。

これで新たにテーブルを作成することができました!

テーブルのスキーマを変更する

先ほどの作業で新たにテーブルを作成することができましたが、今度はこのテーブルの構造を変更してみましょう。

投稿に著者の名前を追加したくなったとします。カラム名はauthorにすることにします。

先ほどと同じように以下のコマンドでマイグレーションファイルを作成します。

php artisan make:migration add_author_to_posts_table --table=posts

–table オプションで変更したいテーブルの名前を指定します。

作成したファイルを以下のようにします。

<?php

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

class AddAuthorToPostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('posts', function (Blueprint $table) {
            $table->string('author')->after('content');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('posts', function (Blueprint $table) {
            $table->dropColumn('author');
        });
    }
}

up() にはauthorカラムを追加する処理を記述します。contentの後に来るよう指定しています。

down()にはauthorカラムを削除する処理を追加しているのがポイントです。

書き上げたら以下のコマンドを実行してマイグレーションを実行しましょう。

php artisan migrate

実行したらphpMyAdminをみてみましょう。

content の後にauthor カラムが追加されているのがわかりますね。

ロールバックしてみる

先ほど、せっかくdown() にも処理を記述したのでこれを実行してみましょう。
データベースの構造を元に戻ることをロールバック と言います。

以下のコマンドを実行してロールバックしてみましょう。

php artisan migrate:rollback

これを実行すると以下のようにデータベーススキーマがロールバックされていることがわかります。

いかがでしたでしょうか。
以上でマイグレーションの基本は終わりです!

次はEloquentモデルについてです!

The following two tabs change content below.

riri

25歳。 Twitter:りりー@ryudoi1 // windii socialというslackチャンネルで質問や雑談等受け付けてるので気軽に参加してください!(もちろん無料です) フリーランスになるまでの過程は こちら

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

PAGE TOP