에러

[Doctrine\DBAL\DBALException]
Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.


에러 원인

위와 같은 에러가 발생했다면 분명 테이블에 컬럼을 추가 하거나 혹은 타입을 변경하거나...어쨌든 테이블을 수정하려고 했을 것입니다.

우선 개발자가 오타를 내거나 그런건 아닙니다. 단지 enum 타입이 포함된 테이블을 수정할 수 있도록 지원을 해주지 않기 때문에 발생하는 에러입니다.

친절하게도 라라벨에서는 아래와 같이 안된다고 알려주고 있었습니다...

"Renaming any column in a table that also has a column of type enum is not currently supported."


해결방법

해결방법은 단순하지만 쫌...번거롭습니다.

enum 타입의 컬럼을 다른 타입으로 변경한 후에 원하시는 코드를 작성하고 그 다음 다시 enum 타입으로 돌려놓는 것입니다. enum 타입을 다른 타입으로 변경할 때 가장 좋은 타입은 varchar 입니다라고 저는 생각합니다.

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

class AddColumnsProtectionBackupOnRules extends Migration
{
    /**
        * Run the migrations.
        *
        * @return void
        */
    public function up()
    {
        DB::statement('ALTER TABLE 테이블명 ALTER enum컬럼명 DROP DEFAULT;');
        DB::statement('ALTER TABLE 테이블명 CHANGE COLUMN enum컬럼명 enum컬럼명 VARCHAR(255) NOT NULL;');

        Schema::table('테이블명', function (Blueprint $table) {
            // 테이블 변경 코드 작성
        });

        DB::statement('ALTER TABLE 테이블명 ALTER enum컬럼명 DROP DEFAULT;');
        DB::statement('ALTER TABLE 테이블명 CHANGE COLUMN enum컬럼명 enum컬럼명 ENUM("a","b","c") NOT NULL DEFAULT "admin";');
    }

    /**
        * Reverse the migrations.
        *
        * @return void
        */
    public function down()
    {
        DB::statement('ALTER TABLE 테이블명 ALTER enum컬럼명 DROP DEFAULT;');
        DB::statement('ALTER TABLE 테이블명 CHANGE COLUMN enum컬럼명 enum컬럼명 VARCHAR(255) NOT NULL;');

        Schema::table('테이블명', function (Blueprint $table) {
            // 변경되기 이전 코드 작성
        });

        DB::statement('ALTER TABLE 테이블명 ALTER enum컬럼명 DROP DEFAULT;');
        DB::statement('ALTER TABLE 테이블명 CHANGE COLUMN enum컬럼명 enum컬럼명 ENUM("a","b","c") NOT NULL DEFAULT "admin";');
    }
}