かきスタンプ

福岡でフリーランスの物流系のエンジニアやってます。

Laravel:migration 実行時、MySQL の時だけ実行するコマンドを設定する

Laravel の migration は便利なのですが、テーブルのスキーマ定義が、Laravel の命令だけで解決できない事があります。

例えば、「テーブル名にコメントを付ける」といった命令は用意されていないため、実行したい場合は DBドライバごとの固有のコマンドを使用する必要があります。( Laravel 8 時点)

具体的には、DB::statement メソッドにて、ALTER TABLE コマンドを実行します。

しかし、ALTER TABLE コマンドは、ほとんどの場合、RDB固有のコマンドとなってしまうため、migration の本流に載せるのは避けたい。

そんな感じで、「データベースドライバが MySQL の時だけ実行したい」または「SQLite の時だけ実行したい」といった場合、getDriverName() にて、データベースドライバを名を取得して、識別する方法があります。

具体的には、以下のようなコード。

    public function up()
    {
        if (DB::getDriverName() !== 'mysql') {
            return;
        }

        DB::statement("ALTER TABLE `users` COMMENT 'ユーザマスタ'");
    }

上記の場合、MySQL の時のみ、ALTER TABLE コマンドを実行します。
SQLite の場合、DB::getDriverName() にて 'sqlite' という値を取得します。)

コードを書く場合、変に switch文で分岐させるよりも、個別のドライバ用に migration ファイルを用意して、該当のドライバでなければ早期リターンする、という構造がいいんじゃないかと思います。