せっかなくので、やってみた。

日々のあんなこと、こんなこと、せっかくなのでやってみた

Laravelでユニークインデックスを追加するとmigrate:rollbackできない件

mariadb10.2、laravel5.5で確認。
mysqlでtext型に設定したカラムにユニークインデックスを張ろうとすると、以下のエラーとなってしまいます。

SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column 'hoge' used in key specification without a key length (SQL: alter table `hoge` add unique `hoge_moga_unique`(`moga`))

なので、以下の様に先にtext型をvarchar型に変更する必要があります。

    public function up()
    {
        Schema::table('hoge', function (Blueprint $table) {
            $table->string('moga', 255)->change();
            $table->unique(['moga']);
        });
    }

    public function down()
    {
        Schema::table('hoge', function (Blueprint $table) {
            $table->dropUnique(['moga']);
            $table->text('moga')->change();
        });
    }

これで php artisan migrate は成功するけど、php artisan migrate:rollback しようとするとなぜか同じエラーになってしまう。

 SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column 'mgoa' used in key specification without a key length (SQL: alter table `hoge` add unique `hoge_moga_unique`(`moga`))

どうもdropUnique()と同一トランザクションでtext()->change()しても、dropUnique()した変更が反映されていないみたいです。
以下の様にSchema::tableメソッドを分割することにより、rollbackできるようになりました。

    public function down()
    {
        Schema::table('hoge', function (Blueprint $table) {
            $table->dropUnique(['moga']);
            // 以下でも動作する
            // $table->dropIndex('hoge_moga_unique');
        });
        Schema::table('hoge', function (Blueprint $table) {
            $table->text('moga')->change();
        });
    }