2

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

        $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();

我需要将“角色”列类型更改为“文本”,然后在 Laravel 中运行新的迁移。如果我不想对以前的数据产生影响,那么最好的方法是什么。

4

2 回答 2

5

您可以尝试:

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

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

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

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

于 2016-07-10T10:27:48.357 回答
4

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

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

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

更新: 您需要安装doctrine/dbal它才能工作,请参阅Laravel 迁移 - 修改列

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

注意:目前不支持修改表中也具有 enum 类型的列的任何列。

于 2016-07-10T10:45:56.407 回答