dotelauv682684
2016-07-10 10:15
浏览 219
已采纳

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

I have a User table in my DB:

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

I need to change 'role' column type to 'text' and after that, run the new migration in Laravel. If I want to have no effect on previous data, what is the best way to do this.

图片转代码服务由CSDN问答提供 功能建议

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

  $  table-> incrementments('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条回答 默认 最新

  • dontoften8899 2016-07-10 10:27
    已采纳

    You could try to:

    1. Create a new text column named "roleTemp"
    2. Run a query to set this column for each record - based on the "role" column
    3. Remove the "role" column
    4. Rename "roleTemp" to "role"

    Now simply change your database schema as is:

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

    Basically you duplicate the role values to a (temporarily) column and rename it. At least it is safe and won't take a lot of time.

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • doushouxie7064 2016-07-10 10:45

    It is as simple as following, create a new migration with this one line. Note the ->change() function, that makes it a ALTER query.

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

    Remember the size for string() by default is 255, and if your enum value is greater than that, it will truncate the enum value to 255 characters.

    Update: You need to install doctrine/dbal for this to work see Laravel Migration - Modify Columns

    To install doctrine/dbal just do composer require doctrine/dbal

    Note: Modifying any column in a table that also has a column of type enum is not currently supported.

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题