在 Laravel 迁移中更改列类型的最佳方法是什么?

What is the best way to change a column type in Laravel migration?

我的数据库中有一个用户 table:

        $table->increments('id');
        $table->string('fullName');
        $table->string('email')->unique();
        $table->string('password', 50);
        $table->enum('role',['boss','employee','customer'])->default('customer');
        $table->rememberToken();
        $table->timestamps();

我需要将 'role' 列类型更改为 'text',然后 运行 Laravel 中的新迁移。如果我想对以前的数据没有影响,最好的方法是什么。

您可以尝试:

  1. 创建一个名为 "roleTemp"
  2. 的新文本列
  3. 运行 为每条记录设置此列的查询 - 基于 "role" 列
  4. 删除 "role" 列
  5. 将 "roleTemp" 重命名为 "role"

现在只需按原样更改数据库架构:

$table->increments('id');
$table->string('fullName');
$table->string('email')->unique();
$table->string('password', 50);
$table->string('role');
$table->rememberToken();
$table->timestamps();

基本上,您将角色值复制到(临时)列并重命名。至少是安全的,不会花很多时间。

就像下面这样简单,用这一行创建一个新的迁移。请注意 ->change() 函数,它使它成为一个 ALTER 查询。

Schema::table('usertable', function (Blueprint $table) {
    $table->string('role')->default('author')->change();
});
    

请记住 string() 的大小默认为 255,如果您的枚举值大于该值,它会将枚举值截断为 255 个字符。

更新: 您需要安装 doctrine/dbal 才能正常工作,请参阅 Laravel Migration - Modify Columns

要安装 doctrine/dbal 只需执行 composer require doctrine/dbal

注意:当前不支持修改 table 中也有枚举类型列的任何列。