你应该避免使用枚举(enum)。即使在 Laravel 5.8 中,问题仍未解决。感谢所有提醒的人。
Laravel 5.1 的官方文档明确表示:
注意:目前不支持重命名具有 enum 列的表中的列。
此外,当向 enum 列声明添加可用选项时,您将遇到相同的问题。
这让我得出一个结论,你应该小心使用枚举(enum),甚至根本不应该使用枚举(enum)。
我不能赞同任何要求用字符串替换枚举的答案。不,你需要创建一个查找表,并用 unsignedInteger 作为 foreign key 来替换 enum。
这是很大的工作量,如果没有以前的单元测试覆盖率,你会很沮丧,但这是正确的解决方案。
你可能因为花费太长时间而被解雇,但别担心,你会找到更好的工作的。 :)
以下是向 enum
列声明添加可用选项的一个示例:
假设你有以下内容:
Schema::create('blogs', function (Blueprint $table) {
$table->enum('type', [BlogType::KEY_PAYMENTS]);
$table->index(['type', 'created_at']);
...
你需要提供更多可用的类型。
public function up(): void
{
Schema::table('blogs', function (Blueprint $table) {
$table->dropIndex(['type', 'created_at']);
$table->enum('type_tmp', [
BlogType::KEY_PAYMENTS,
BlogType::KEY_CATS,
BlogType::KEY_DOGS,
])->after('type');
});
DB::statement('update `blogs` as te set te.`type_tmp` = te.`type` ');
Schema::table('blogs', function (Blueprint $table) {
$table->dropColumn('type');
});
Schema::table('blogs', function (Blueprint $table) {
$table->enum('type', [
BlogType::KEY_PAYMENTS,
BlogType::KEY_CATS,
BlogType::KEY_DOGS,
])->after('type_tmp');
});
DB::statement('update `blogs` as te set te.`type` = te.`type_tmp` ');
Schema::table('blogs', function (Blueprint $table) {
$table->dropColumn('type_tmp');
$table->index(['type', 'created_at']);
});
}
enum
列? - Adrenaxus