Метод unique
Метод unique вызывается на объекте Blueprint в миграции Laravel. Он создаёт индекс уникальности для указанных колонок. Если метод вызывается для одной колонки, то уникальным будет её значение. Если передаётся массив колонок, уникальность гарантируется для комбинации их значений. При попытке вставки или обновления записи с дублирующимся значением в колонке с уникальным индексом будет выброшено исключение.
Синтаксис
<?php
// Для одной колонки:
$table->unique($column, $name);
// Для нескольких колонок:
$table->unique([$column1, $column2], $name);
?>
Параметр $column (или массив колонок) обязателен. Второй параметр $name - необязательное имя индекса. Если имя не указано, Laravel сгенерирует его автоматически по схеме: table_column1_column2_unique.
Пример
Добавим уникальный индекс для колонки email в таблице users:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('email');
$table->string('name');
$table->unique('email');
$table->timestamps();
});
}
};
?>
После выполнения миграции, попытка создать двух пользователей с одинаковым email вызовет ошибку.
Пример
Создадим уникальный составной индекс для колонок product_id и color_id в таблице product_colors:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('product_colors', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('product_id');
$table->unsignedBigInteger('color_id');
$table->unique(['product_id', 'color_id']);
$table->timestamps();
});
}
};
?>
Теперь одна и та же комбинация товара и цвета не может быть добавлена дважды.
Пример
Создадим уникальный индекс с пользовательским именем для колонки phone:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->string('phone')->nullable();
$table->unique('phone', 'users_phone_unique');
});
}
};
?>
В этом случае создаётся индекс с явно заданным именем users_phone_unique, что может быть удобно для управления индексами в будущем.
Пример
Удалим уникальный индекс с колонки email:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropUnique('users_email_unique');
});
}
};
?>
Метод dropUnique принимает имя индекса, которое можно узнать в базе данных или сгенерировать по стандартному шаблону Laravel.
Смотрите также
-
метод
index,
который создаёт обычный индекс для ускорения поиска -
метод
primary,
который создаёт первичный ключ таблицы -
метод
foreign,
который создаёт внешний ключ для связи таблиц -
метод
dropColumn,
который удаляет колонку из таблицы