laravel 4.2:迁移具有唯一约束的字符串字段失败

时间:2017-06-09 22:15:50

标签: php mysql laravel-4

我想在项目中添加dash_title。我们的想法是拥有一个人类可读的ID。也可以在网址中轻松使用。

所以我用:

创建了我的迁移
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'

在迁移之前,似乎存在dash_title列。但我确信事实并非如此。

无论如何它都是由迁移命令创建的。但没有unique标志。 mysql控制台说:

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

我有点失落。我真的需要为这个字段创建一个unique约束。怎么样?

1 个答案:

答案 0 :(得分:1)

错误是由于当前项目行的更新造成的。

所以解决方案是:

  1. 创建新字段:dash_title
  2. 以逻辑方式迁移当前行
  3. 添加unique约束
  4. 所有这些都可以在迁移中完成:

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