Уникальный составной индекс в Laravel часто используется для того, чтобы в базе данных MySQL не дублировались записи (строки), которые имеют определенные значения для нескольких полей таблицы. То есть, мы можем сделать так, чтобы записи были уникальны по определенным полям. Безусловно, разработчик может попытаться реализовать этот функционал на стороне PHP и средствами самого фреймворка Laravel. Однако это решение не даст 100% гарантий, по сравнению с индексом в Базе данных.
Уникальный составной индекс — это тип индекса в базе данных, который строится по нескольким столбцам таблицы и гарантирует, что комбинация значений в этих столбцах будет уникальной для каждой строки, предотвращая дублирование данных.
Как создать Уникальный составной индекс с помощью Миграции Ларавель?
Предположим что в реальном проекте уже имеется таблица в MySQL для хранения данных о Заказах «orders» со следующими полями:
- id
- product_id
- owner_id
- event_id
- quantity
- amount
- total
И собственник проекта поставил перед разработчиком задачу, чтобы на каждом Мероприятии каждый Пользователь мог создать только один Заказ для определенного Товара. В таком случае нам понадобится составной уникальный индекс по нескольким полям:
- product_id
- owner_id
- event_id
Чтобы такой Уникальный составной индекс создать в Laravel, необходимо создать миграцию с помощью следующей команды:
php artisan make:migration add_unique_composite_index_to_orders_tableCode language: CSS (css)
Данная команда создаст файл миграции, который будет размещен в директории проекта database/migrations/*****_add_unique_composite_index_to_orders_table.php
Содержимое файла следует заполнить следующим образом:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddUniqueCompositeIndexToOrdersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('orders', function (Blueprint $table) {
$table->unique(['product_id', 'owner_id', 'event_id'], 'unique_orders_by_event');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('orders', function (Blueprint $table) {
$table->dropUnique('unique_orders_by_event');
});
}
}
Code language: PHP (php)
После того, как этот файл будет готов, следует накатить эту миграцию с помощью следующей команды:
php artisan migrate
Эта команда запустит выполнение миграции. При этом произойдут изменения в структуре таблицы orders, а именно будет добавлен уникальный составной индекс, который будет уникален по трем полям [ID Товара, ID Пользователя, ID Мероприятия].
Как это работает?
В следующий раз, когда будет попытка создать запись в таблице orders с НЕуникальной комбинацией значений в столбцах созданного ранее индекса, то будет выброшена ошибка (exception). Таким образом, создать дублирующую запись просто не удастся.
Вермутофф