在 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 中的新迁移。如果我想对以前的数据没有影响,最好的方法是什么。
您可以尝试:
- 创建一个名为 "roleTemp"
的新文本列
- 运行 为每条记录设置此列的查询 - 基于 "role" 列
- 删除 "role" 列
- 将 "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 中也有枚举类型列的任何列。
我的数据库中有一个用户 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 中的新迁移。如果我想对以前的数据没有影响,最好的方法是什么。
您可以尝试:
- 创建一个名为 "roleTemp" 的新文本列
- 运行 为每条记录设置此列的查询 - 基于 "role" 列
- 删除 "role" 列
- 将 "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 中也有枚举类型列的任何列。