mySQL-Unicity约束取决于其他列

时间:2018-08-25 22:35:30

标签: mysql laravel

我有一个表item,其列为id type code image

类型列

type是一个枚举,可以是textlogo

可能的情况

如果type === 'text',则imagenull

如果type === 'logo',则codenull

我想要的东西

如果type === 'text',则唯一性由code定义 如果type === 'logo',则唯一性由image

定义

问题

如何在mySQL中编写此唯一约束?在使用laravel进行迁移时?

2 个答案:

答案 0 :(得分:1)

我认为您不能以这种方式声明唯一约束。不过,您可以通过保留type列,但为codelogo使用单个字段来简化表。例如,您可以将此字段称为value。然后,您可以像这样向typevalue添加唯一约束:

Schema::create('items', function (Blueprint $table) {
    // Your fields here...

    $table->unique(['type', 'value']);
});

为方便起见,您总是可以在模型中添加访问器,以访问codeimage,就好像它们是字段一样,例如:

class Item extends Model
{
    public function getCodeAttribute()
    {
        return $this->type === 'text' ? $this->value : null;
    }

    public function getImageAttribute()
    {
        return $this->type === 'logo' ? $this->value : null;
    }
}

这将使您可以像访问字段一样访问codeimage,并且模型将根据{的类型返回valuenull {1}}。

Item

答案 1 :(得分:0)

在迁移表中创建代码和图片列,默认值为null,然后,如果您未为列设置值,则其值将自动为null

$table->enum('type', ['image', 'code']);
$table->string('image')->default(null);
$table->string('code')->default(null);