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

时间:2016-07-10 10:15:54

标签: php laravel laravel-5 laravel-migrations

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

        $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中运行新的迁移。如果我想对以前的数据没有影响,那么最好的方法是什么。

2 个答案:

答案 0 :(得分:4)

就像下面一样简单,用这一行创建一个新的迁移。请注意->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

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

答案 1 :(得分:2)

您可以尝试:

  1. 创建一个名为&#34; roleTemp&#34;
  2. 的新文本列
  3. 运行查询以根据&#34;角色&#34;为每条记录设置此列。柱
  4. 删除&#34;角色&#34;柱
  5. 重命名&#34; roleTemp&#34;到&#34;角色&#34;
  6. 现在只需按原样更改数据库架构:

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

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