我想在项目中添加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
约束。怎么样?
答案 0 :(得分:1)
错误是由于当前项目行的更新造成的。
所以解决方案是:
dash_title
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');
});
}