[ワンポイントLaravel] Migration

先日も記事にましたが、最近Laravel開発を始めたのでLaravelの小ネタを備忘録的に残していきます。

あると良さそうなバージョン情報

  • PHP 7.3 (執筆時点の最新)
  • Laravle 6.0 (執筆時点の最新)
  • DB: MySQL 5.7.19

この記事のポイント

  • migrationsの基本的な書き方
  • テーブルコメントの記載方法
  • 外部キー制約が存在するテーブル定義

migrationsの基本的な書き方

とは行ってみたものの、日本語でわかりやすくまとまっているサイトがあるので紹介のみとしておきます。

参考:Laravel 6.0 データベース:マイグレーション

テーブルコメントの記載方法

カラムコメントは

$table->bigIncrements('id')->comment('プライマリーキー');

みたいにすれば定義できるのですが、テーブルコメントを定義するためのメソッドは用意されていないみたいです。

そのため、下記のような方法で定義します。

Schema::create('users', function (Blueprint $table) {
    $table->bigIncrements('id')->comment('PK');
    // テーブル定義
});

DB::statement("ALTER TABLE `users` COMMENT 'ユーザーテーブル'");

一度、 Schema::create() でテーブルを作成した後に、 ALTER TABLEを実行することでテーブルコメントを定義します。

外部キー制約が存在するテーブル定義

外部キーの書き方自体は冒頭で紹介したサイトにてわかりやすく説明されています。
サイト内で「外部キー制約」とか検索すればすぐにヒットします。

参考:Laravel 6.0 データベース:マイグレーション

ここでは、注意すべきポイントを紹介します。

ポイント1. 実行順序

migrationの実行はファイル名に依存します。

外部キーを利用する場合、artisan でmigrationファイルを作成する順序を間違えた時には、外部キーの参照先のテーブルが先に実行されるようにファイル名を修正してあげましょう。

ポイント2. 外部キーチェックを無効化

ポイント1で「実行順序を整えるポイント」を説明しましたが、ぶっちゃけそんなん面倒くさいですよね。
私は面倒臭かったです。

なので、私は下記のようにしました。

  1. 外部キーチェックを無効化してDDLを実行
  2. DDL実行後に外部キーを有効化

もう少し具体的に説明します。

ポイント1の説明で「migrationの実行はファイル名に依存します。」とお話ししました。

この特性を利用して下記のようにmigrationを作成&実行することでうまくいきました。

  1. 2000_01_01_000000_begin.php というファイルを作成
  2. 2099_12_12_235959_finish.phpというファイルを作成
  3. それぞれで外部キー制約チェックをON/OFF

それぞれの実装は下記の通りです。

2000_01_01_000000_begin.php

<?php

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

class Begin extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::disableForeignKeyConstraints();
    }

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

2099_12_12_235959_finish.php

<?php

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

class Finish extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::enableForeignKeyConstraints();
    }

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

外部制約キーチェックを無視してDDLを実行するので、注意が必要ですが「こういう方法もあるよー」という紹介でした。

まとめ

外部キーではDDLを実行する方法を2点ほど紹介しましたが、ポイント1で紹介した方法で実行した方が事故が少なくて良いと思います。

ポイント2で順序を無視して実行する方法を紹介しましたが、開発途中では便利ですが、リリース直前ではポイント1の方法に切り替えて実行することを強くお勧めします。

また、これは私の好みの話でもあるのですが、DDLには可能な限り列コメント・テーブルコメントを入れましょう。

あるとないとでは、後続する担当者への引き継ぎコストが大きく変わります。

また、A5:SQL Mk-2 のように定義されたコメントを取得して、論理名・物理名を含むテーブル設計を自動で出力してくれるツールの恩恵なども受けられます。

シェアする

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

フォローする