миграция laravel — уникальная комбинация столбцов типа longText

У меня есть таблица с колонками, как это:

...
$table->longText('title')->comment('Event title');
$table->decimal('start_year',13,0)->nullable(true)->comment('Year part of beginning of event date');
$table->decimal('start_month',2,0)->default(0)->comment('Month part of beginning of event date');
$table->decimal('start_day',2,0)->default(0)->comment('Day part of beginning of event date');
...

Мне нужен объединенный уникальный индекс, основанный на этих столбцах. Но «заголовок» — это длинный текст.

Этот не работает:

$table->unique([['title','255'], 'start_year', 'start_month', 'start_day'],'unique_title_and_date');

Инструмент миграции говорит:

[ErrorException]
strtolower() expects parameter 1 to be string, array given

Этот не работает также:

$table->unique(['title(255)', 'start_year', 'start_month', 'start_day'],'unique_title_and_names');

Инструмент миграции говорит:

  [PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1072 Key column 'title(255)' doesn't exist in table

Этот не работает также:

$table->unique(['title', 'start_year', 'start_month', 'start_day'],'unique_title_and_names');

Инструмент миграции говорит:

[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column 'title' used in key specification without a key length

Как заставить инструмент миграции есть эту команду?

0

Решение

Наконец-то я нашел какое-то решение.
Поскольку мне нужен уникальный индекс для текстового столбца в сочетании с другими столбцами, представляется возможным решение использовать метод DB :: unprepared в миграции.

Итак, я создал класс с именем AddUniquesToEvents, например так:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddUniquesToEvents extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::unprepared('ALTER TABLE timeline_events
ADD UNIQUE key u_title_and_dates (title(64),start_year, start_month,start_day)'
);
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::unprepared('ALTER TABLE timeline_events drop index `u_title_and_dates`');
}
}

Миграция заставляет его работать успешно.

1

Другие решения

Если вы измените: `

$table->longText('title')->comment('Event title');

чтобы:

$table->string('title',200)->comment('Event title');

это будет работать, но я не знаю, ожидаете ли вы названия с более длинным (200) текстом ..

0

По вопросам рекламы [email protected]