我有一个表item
,其列为id
type
code
image
type
是一个枚举,可以是text
或logo
。
如果type === 'text'
,则image
是null
如果type === 'logo'
,则code
是null
如果type === 'text'
,则唯一性由code
定义
如果type === 'logo'
,则唯一性由image
如何在mySQL中编写此唯一约束?在使用laravel进行迁移时?
答案 0 :(得分:1)
我认为您不能以这种方式声明唯一约束。不过,您可以通过保留type
列,但为code
或logo
使用单个字段来简化表。例如,您可以将此字段称为value
。然后,您可以像这样向type
和value
添加唯一约束:
Schema::create('items', function (Blueprint $table) {
// Your fields here...
$table->unique(['type', 'value']);
});
为方便起见,您总是可以在模型中添加访问器,以访问code
或image
,就好像它们是字段一样,例如:
class Item extends Model
{
public function getCodeAttribute()
{
return $this->type === 'text' ? $this->value : null;
}
public function getImageAttribute()
{
return $this->type === 'logo' ? $this->value : null;
}
}
这将使您可以像访问字段一样访问code
和image
,并且模型将根据{的类型返回value
或null
{1}}。
Item
答案 1 :(得分:0)
在迁移表中创建代码和图片列,默认值为null,然后,如果您未为列设置值,则其值将自动为null
$table->enum('type', ['image', 'code']);
$table->string('image')->default(null);
$table->string('code')->default(null);