我尝试使用模式构建器向表添加枚举选项(而不丢失当前数据集)。
我唯一真正能够找到的关于列更改的是http://www.flipflops.org/2013/05/25/modify-an-existing-database-column-in-a-laravel-migration/,我相信这是为Laravel 3编写的。
即便如此,我还是尝试使用DB::query('ALTER TABLE...');命令,但它因call_user_func_array()而出错,预期参数1为有效回调,类“Illuminate\Database\MySqlConnection”没有方法“query”。
DB::query("ALTER TABLE users CHANGE COLUMN permissions permissions ENUM('admin', 'user', 'candidate')");
我也试过这样做:
Schema::table('users', function ($table) {
$table->enum('permissions', array('admin', 'user', 'candidate'))->default('user');
});
但它会出错,说该列已经存在。
在不丢失该列中所有数据的情况下,执行我尝试执行的操作的最佳方法是什么?
5条答案
按热度按时间liwlm1x91#
使用
DB::statement
方法:gajydyqb2#
我已经将Joseph's answer修改为一个方法,您可以将其添加到迁移中,然后使用一个值数组调用,而不是将其硬编码到语句中。它没有对带引号的值进行任何花哨的处理,因此请只使用合理的值,或者自己修改它。
您可以在迁移中使用它,如下所示:
nxagd54h3#
如果以上选项都不适合您,try this old solution。它仍然有效。这是在我的情况下唯一有效的。
my_table”是表的名称,“status”是枚举列的名称
gojuced74#
在我的例子中,我想将"Wide_Skyscraper"添加到现有的枚举选项中,可接受的答案指向使用
DB::transaction
和DB::statement
的解决方案,但没有一个答案指出在将RAW语句输入到SQL中时尝试/捕获wrap和rollBack
的安全方法。迁移文件的UP方法:
你可以只在down方法中添加一个注解,不要删除这个方法。
希望这能帮到什么人。
83qze16e5#
修改列
先决条件
在修改列之前,请确保将doctrine/dbal相关性添加到composer.json文件中。Doctrine DBAL库用于确定列的当前状态,并创建对列进行指定调整所需的SQL查询:
https://laravel.com/docs/5.8/migrations#modifying-columns