根据这个答案,如果我想要更新MySQL中的
enum
,我必须运行原始查询。但是,在PostgreSQL中,我不能使用此查询,并且Laravel中的PostgreSQL枚举类型似乎很奇怪。
是否有任何方法可以在postgreSQL迁移中更新枚举?
enum
,我必须运行原始查询。但是,在PostgreSQL中,我不能使用此查询,并且Laravel中的PostgreSQL枚举类型似乎很奇怪。
是否有任何方法可以在postgreSQL迁移中更新枚举?
Laravel在字符变量
上使用枚举
约束。
假设有一个名为mytable
的表格,其中包含一个枚举列status
,我们需要在迁移中删除该约束(命名为tablename_columnname_check),并像下面这样添加它:
DB::transaction(function () {
DB::statement('ALTER TABLE mytable DROP CONSTRAINT mytable_status_check;');
DB::statement('ALTER TABLE mytable ADD CONSTRAINT mytable_status_check CHECK (status::TEXT = ANY (ARRAY[\'pending\'::CHARACTER VARYING, \'accepted\'::CHARACTER VARYING, \'canceled\'::CHARACTER VARYING]::TEXT[]))');
});
它解决了这个问题,希望能有所帮助!
扩展 @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']);