mySQL - ограничение Unicity в зависимости от другого столбца - PullRequest
0 голосов
/ 26 августа 2018

У меня есть таблица item, столбцы которой id type code image

Тип столбца

type - это перечисление, которое может быть text или logo.

Возможные ситуации

Если type === 'text', то image равно null

Если type === 'logo', то code равно null

Что бы я хотел

Если type === 'text', тогда уникальность определяется как code Если type === 'logo', тогда уникальность определяется как image

Вопросы

Как я могу написать это уникальное ограничение в mySQL?В миграции с Laravel?

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

создать столбец кода и изображения в таблице миграции со значением по умолчанию, равным NULL, тогда, если вы не установите значение для столбца, его значение будет равно NULL автоматически

$table->enum('type', ['image', 'code']);
$table->string('image')->default(null);
$table->string('code')->default(null);
0 голосов
/ 26 августа 2018

Я не думаю, что вы можете объявить уникальное ограничение таким образом.Вы можете упростить свою таблицу, сохранив столбец 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...