Сегодня я пытался создать строковый столбец для пули в одной из моих таблиц. Мне потребовалось, чтобы столбец имел уникальный индекс, но в таблице уже была информация, поэтому в момент создания столбца я получил сообщение об ошибке, информирующее меня о повторяющихся и пустых значениях в новом столбце.
public function up(){
Schema::table( 'states', function( Blueprint $table ){
$table->string( 'slug', 128 )->unique();
} );
}
Так как слаг будет содержать слаганную версию столбца «имя», я решил создать столбец в два этапа. Сначала этот столбец должен был быть обычным, и я собирался циклически проходить по всем записям, создавая правильное значение слага, используя Str :: slug (). После этого я собирался изменить столбец, добавив параметр unique (), следуя документации Laravel :
public function up(){
Schema::table( 'states', function( Blueprint $table ){
$table->string( 'slug', 128 );
$states = State::all();
foreach( $states as $state ){
$state->slug = Str::slug( $state->name );
$state->save();
}
$table->string( 'slug', 128 )->unique()->change();
} );
}
Я подумал, что это хорошее решение, потому что я не собирался нарушать никаких правил в моей базе данных, так как все имена были разными. Я запустил миграцию и получил приятную ошибку:
SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'slug' (SQL: alter table `states` add `slug` varchar(128) not null)
Есть идеи, как правильно создать миграцию?