2018/05/22更新

[PHP] Laravelのマイグレーションで、テーブルを新規作成する

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
マイグレーション機能があるとデータベースの管理が簡単にできて便利です。Laravelのマイグレーション機能を用いて、DBテーブルの新規作成する方法をブログに書きたいと思います。



目次




対象バージョン

Laravelの5.6を対象としていますが、5系なら同じと思います。違う部分は適宜読み替えを御願いします。



マイグレーション機能とは

テーブル作成やカラム追加などのデータベースへの変更を管理する機能です。Laravelの場合には、変更内容を記載したマイグレーションファイルを作成し(変更ごとに1つずつ作成する)、それをArtisanコマンドで実行します。

マイグレーション機能が便利な点として、Create文などのSQLそのものを書く必要がないこと、複数のデータベースに同じ記述で対応できること、ロールバックもコマンド1つでできること、PHPUnitテストなどでもそれが利用できること、途中から参加した開発者のデータベース設定がすぐに終わること、など色々とメリットがあります。マイグレーションを開発/運用で利用すると便利なことが多いです。

Laravelにもマイグレーション機能が用意されていて、様々な機能が提供されています。今日はその中で、テーブルの作成についてブログを書きたいと思います。



テーブル作成のマイグレーションを行う

マイグレーションは3つのステップで実現できます。マイグレーションファイルの作成、マイグレーションファイルへの記載、マイグレーションの実行、です。


マイグレーションファイルの作成する

artisanコマンドで、マイグレーションファイルを新規作成します。
# Ownersテーブルを新規作成するための、マイグレーションファイルを作るコマンド.
php artisan make:migration create_owners_table
create_xxx_tablexxxにテーブル名を記載することで、そのテーブルを作成する為のマイグレーションファイルが作成されます。作成されたファイルは、以下に保存されます。
# マイグレーションのファイルパス
# ファイル名にはそれを作成した日時が含まれる.
database/migrations/2018_05_17_101656_create_owners_table.php
作成直後は以下のような記述となっています。
<?php

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

class CreateOwnersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()  // マイグレーション実行時に呼び出される関数.
    {
        Schema::create('owners', function (Blueprint $table) {
            $table->increments('id');  // 主キー
            $table->timestamps();      // created_at と updated_at カラムの作成.
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down() // ロールバック時に呼び出される関数.
    {
        Schema::dropIfExists('owners');
    }
}
up()down()の2つのメソッドがあります。マイグレーション実行時にはup()が呼び出され、その中でSchema::createを実行することでテーブルを新規に作成します。


マイグレーションファイルを編集する

上記で作成したマイグレーションファイルを編集して、up()関数のコールバックの中に、追加したいカラムを追記します。
public function up()
{
    Schema::create('owners', function (Blueprint $table) {
        $table->increments('id');
        $table->string("login_id", 64)->unique();
        $table->string("password");
        $table->string("access_token")->nullable();
        $table->timestamp("access_token_expired_at");
        $table->timestamps();
    });
}
$table->string()は文字列のカラムを定義し、$table->integer()は数値型のカラムを定義します。指定できるデータ型は多数あり、マイグレーションの「使用できるカラムタイプ」にて確認できます。

nullable()はカラム修飾子と呼ばれるもので、カラムに制限を追加します。ここではNULL可のカラムを定義しています。カラム修飾子の一覧はマイグレーションの「カラム修飾子」を参照ください。

unique()はユニークキーを定義しています。ユニークキーを含むインデックスの作成は、マイグレーションの「インデックス作成」を参照ください。


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

作成したマイグレーションファイルを実行するには、以下のArtisanコマンドを利用します。
$ php artisan migrate
これでマイグレーションをデータベースに適用しました。なお事前にデータベースの接続設定が必要です。まだの場合には、[PHP] Macで、Laravel5.6の、起動、MySQL接続設定まで行うをご確認ください。

また、データベースも事前に作成しておく必要があります。以下のコマンドで作成します。
# MySQLの場合(データベース名は myapp )
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
絵文字を格納できるutf8mb4という文字コードを、Laravelはデフォルトでは利用します。データベースも同じ文字コードで作成します。



マイグレーション結果を確認する

データベースに接続して、マイグレーションが行われたことを確認します。
# mysqlのコマンド

# テーブル一覧を確認
mysql> show tables;
+---------------+
| Tables_in_sss |
+---------------+
| migrations    |
| owners        |
+---------------+

# テーブル定義の確認.
mysql> desc owners;
+-------------------------+------------------+------+-----+-------------------+-----------------------------+
| Field                   | Type             | Null | Key | Default           | Extra                       |
+-------------------------+------------------+------+-----+-------------------+-----------------------------+
| id                      | int(10) unsigned | NO   | PRI | NULL              | auto_increment              |
| login_id                | varchar(64)      | NO   | UNI | NULL              |                             |
| password                | varchar(255)     | NO   |     | NULL              |                             |
| access_token            | varchar(255)     | NO   |     | NULL              |                             |
| access_token_expired_at | timestamp        | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| created_at              | timestamp        | YES  |     | NULL              |                             |
| updated_at              | timestamp        | YES  |     | NULL              |                             |
+-------------------------+------------------+------+-----+-------------------+-----------------------------+
8 rows in set (0.01 sec)
ownersテーブルが作成されていることがわかります。

また、migrationsテーブルも作成されます。中身には、マイグレーションの実行履歴が保存されます。
mysql> select * from migrations;
+----+---------------------------------------+-------+
| id | migration                             | batch |
+----+---------------------------------------+-------+
| 1  | 2018_05_17_101656_create_owners_table |     1 |
+----+---------------------------------------+-------+
1 row in set (0.00 sec)



マイグレーションをロールバックする

作成したものを戻す場合には、以下のコマンドを実行します(以下のいずれかの方法を選択します)。
    
# 最後に「一度に」実行したマイグレーションをまとめて元に戻す.
$ php artisan migrate:rollback

# 巻き戻す数を指定する.
php artisan migrate:rollback --step=5

# 全部のマイグレーションを戻す.
php artisan migrate:reset



参考資料

以下の資料を参照しました、ありがとうございます。

Database: Migrations - Laravel(英語、公式)

データベース:マイグレーション 5.5 Laravel(日本語)



最後に

マイグレーションは便利なのですが、実際にファイルを編集しようとした時には、利用可能なデータ型や制約を確認する必要があり、それへのリンクも残しておきたいと思ってブログに書きました。今後もLaravel力をアップできたらと思います。

最後になりますが本ブログでは、PHP、サーバー、フロントエンド、Swift、Node.js、Python、Java、Linux、インフラ、Go言語、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSTwitterをフォローして貰えたら嬉しいです ^ ^

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。