2

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.

Mo-
  • 790
  • 2
  • 10
  • 23

2 Answers2

6

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.

JasonK
  • 5,214
  • 9
  • 33
  • 61
5

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.

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
karmendra
  • 2,206
  • 8
  • 31
  • 49
  • I applied your suggestion but I faced with this error: `[Doctrine\DBAL\DBALException] Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.` – Mo- Jul 11 '16 at 05:24
  • See my updates, this is the right laravally way to do this. – karmendra Jul 11 '16 at 13:54
  • I did that installation, but didn't work! in your link( [https://laravel.com/docs/master/migrations#modifying-columns] ) you can read that : `Modifying any column in a table that also has a column of type enum is not currently supported.` – Mo- Jul 11 '16 at 14:14