Mo-
Mo-

Reputation: 850

What is the best way to change a column type in Laravel migration?

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.

Upvotes: 3

Views: 7384

Answers (2)

karmendra
karmendra

Reputation: 2243

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.

Upvotes: 6

JasonK
JasonK

Reputation: 5284

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.

Upvotes: 6

Related Questions