2017-11-23 4 views
0

入力します。laravel移行 - 列のユニークな組み合わせは、私はこのようなcolumsを持つテーブルを持っている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'); 
... 

私は、これらの列に基づいて合成一意のインデックスが必要です。しかし、 'title'はlongTextです。

この1が動作していない:

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

移行ツールのサイスを:

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

この1も動作していない:

$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 

この1つはまた、動作していない:

$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`'); 
    } 
} 

移行は、それが正常に実行されます。

0

を変更した場合: `

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

をする:

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

それは動作しますが、あなたは長い(200)テキストのタイトルを期待していた場合、私は知らない...

+0

'title'は実際には歴史的理由のために説明のような列です。だから、本当に長いテキストを含むことができなければなりません。 –

関連する問題