2017-06-09 11 views
1

dash_titleをプロジェクトに追加します。アイデアは人間が読めるIDを持つことです。どちらも簡単にURLで使用できます。laravel 4.2:ユニーク制約付きの文字列フィールドの移行に失敗する

だから、私は私の移行を作成しました:

artisan generate:migration add_dash_title_to_projects_table --fields="dash_title:string" 

そして得ることがlaravel 4.2 documentationに指定されている->unique()を追加します。

public function up() 
{ 
    Schema::table('projects', function(Blueprint $table) { 
     $table->string('dash_title')->unique(); 
    }); 
} 

しかし、私はartisan migrate行うとき、私は問題が発生した:

[Illuminate\Database\QueryException]                                          
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'projects_dash_title_unique' (SQL: alter table `projects` add unique projects_dash_title_unique(`dash_title`)) 

[PDOException]                         
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'projects_dash_title_unique' 

と思われます。移行前に10の列が存在していました。しかし、私はそれが事実ではないと確信しています。

とにかく、migratingコマンドによって作成されています。しかし、uniqueフラグなし。 mysqlコンソール:

+-------------------+------------------+------+-----+---------------------+----------------+ 
| Field    | Type    | Null | Key | Default    | Extra   | 
+-------------------+------------------+------+-----+---------------------+----------------+ 
| dash_title  | varchar(255)  | NO |  | NULL    |    | 

私は少し失われています。私は実際にこのフィールドにuniqueという制約を作成する必要があります。の仕方?

+0

[OK]を...私はそれを得ました。このエラーは、既存の行の移行によるものです。だから1番目のフィールドを作成します。次に、何かのロジックでデータを移行します。次に、 'unique'制約を追加します。 – mickro

答えて

1

エラーは現在のプロジェクト行が更新されたためです。

だから、解決策は以下のとおりです。

  1. は、新しいフィールドを作成します。

    dash_title
  2. 移行論理的に現在の行

すべてが、移行に行うことができますunique制約を追加

public function up() 
{ 
    // create the new field 
    Schema::table('projects', function(Blueprint $table) { 
    $table->string('dash_title'); 
    }); 

    // migrate existing rows 
    $projects = Project::all(); 
    foreach ($projects as $p) { 
    $p->dash_title = Helper::sanitize_title_with_dashes($p->title); 
    $p->save(); 
    } 

    // add the unique constraint 
    Schema::table('projects', function(Blueprint $table) { 
    $table->unique('dash_title'); 
    }); 
} 

そして、我々は次のようdown()メソッドを追加することができますきれいな移行ファイル持っている:

public function down() 
{ 
    Schema::table('projects', function(Blueprint $table) { 
    $table->dropColumn('dash_title'); 
    $table->dropColumn('projects_dash_title_unique'); 
    }); 
} 
関連する問題