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(); }); }