mysql-unicity约束取决于其他列

kyxcudwk  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(304)

我有一张table item 列是谁的
id type code image ####类型列 type 是枚举,可以是 text 或者 logo .

可能的情况

如果 type === 'text' 那么 imagenull 如果 type === 'logo' 那么 codenull ####我想要什么
如果 type === 'text' 唯一性定义为 code 如果 type === 'logo' 唯一性定义为 image ####问题
如何在mysql中编写这个惟一的约束?和拉威尔一起迁移?

juzqafwq

juzqafwq1#

在迁移表中创建默认值为null的代码和图像列,如果不为某列设置值,则该列的值将自动为null

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

mcvgt66p2#

我不认为你可以用这种方式声明一个唯一的约束。你可以简化你的table,保持你的 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 根据你的工作类型 Item .

$text = new Item(['type' => 'text', 'value' => 'Hello World!']);
echo $text->code; // Hello World!
echo $text->image; // null

$logo = new Item(['type' => 'logo', 'value' => 'your-image.jpg']);
echo $text->code; // null
echo $text->image; // your-image.jpg

相关问题