Laravel Migration - Update Enum Options
Use the DB::statement
method:
DB::statement("ALTER TABLE users CHANGE COLUMN permissions permissions ENUM('admin', 'user', 'candidate') NOT NULL DEFAULT 'user'");
I have adapted Joseph's answer into a method you can add to your migration and then call with an array of values instead of hardcoding them inside of a statement. It doesn't have any fancy handling of values with quotes in them, so please only use sensible values with it, or modify it for yourself.
private function setEnumValues($table, $column, array $values, $nullable = false, $default = null)
{
$quotedValues = collect($values)
->map(function ($value) {
return "'${value}'";
})
->join(', ');
$suffix = '';
if (!$nullable) {
$suffix .= ' NOT NULL';
}
if ($default) {
$suffix .= " DEFAULT '${default}'";
}
$statement = <<<SQL
ALTER TABLE ${table} CHANGE COLUMN ${column} ${column} ENUM(${quotedValues}) ${suffix}
SQL;
\Illuminate\Support\Facades\DB::statement($statement);
}
You might use it in a migration like so:
<?php
use Illuminate\Database\Migrations\Migration;
class AddQueuedStatusToPaymentsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
// Add the new 'queued' value
$this->setEnumValues(
'payments',
'status',
[
'queued',
'processing',
'successful',
'failed',
],
false, // Not nullable
'queued' // Mark it as the default for all new payments
);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
// Remove the new 'queued' value
$this->setEnumValues(
'payments',
'status',
[
'processing',
'successful',
'failed',
],
false, // Not nullable
'processing' // Set the default back to processing for all new payments
);
}
private function setEnumValues($table, $column, array $values, $nullable = false, $default = null)
{
$quotedValues = collect($values)
->map(function ($value) {
return "'${value}'";
})
->join(', ');
$suffix = '';
if (!$nullable) {
$suffix .= ' NOT NULL';
}
if ($default) {
$suffix .= " DEFAULT '${default}'";
}
$statement = <<<SQL
ALTER TABLE ${table} CHANGE COLUMN ${column} ${column} ENUM(${quotedValues}) ${suffix}
SQL;
\Illuminate\Support\Facades\DB::statement($statement);
}
}