Чтобы расширить ответ @rap-2-h, вот общий метод, который вы можете использовать:
/**
* Alter an enum field constraints
* @param $table
* @param $field
* @param array $options
*/
protected function alterEnum($table, $field, array $options) {
$check = "${table}_${field}_check";
$enumList = [];
foreach($options as $option) {
$enumList[] = sprintf("'%s'::CHARACTER VARYING", $option);
}
$enumString = implode(", ", $enumList);
DB::transaction(function () use ($table, $field, $check, $options, $enumString) {
DB::statement(sprintf('ALTER TABLE %s DROP CONSTRAINT %s;', $table, $check));
DB::statement(sprintf('ALTER TABLE %s ADD CONSTRAINT %s CHECK (%s::TEXT = ANY (ARRAY[%s]::TEXT[]))', $table, $check, $field, $enumString));
});
}
Пример использования:
$this->alterEnum('mytable', 'status', ['pending', 'accepted', 'canceled']);
Обратите внимание: если вы удаляете ограничение, которое используется в таблице, вам нужно будет либо переименовать все экземпляры во что-то, что будет в списке, либо удалить все экземпляры перед запуском этой функции.
person
Zak Henry
schedule
24.03.2016