specific seeds delete column php laravel laravel-4 database-migration

php - seeds - laravel migration add column



CaĆ­da de columna con clave externa Error de Laravel: Error general: 1025 Error al cambiar el nombre (6)

He creado una tabla usando la migración de esta manera:

public function up() { Schema::create(''despatch_discrepancies'', function($table) { $table->increments(''id'')->unsigned(); $table->integer(''pick_id'')->unsigned(); $table->foreign(''pick_id'')->references(''id'')->on(''picks''); $table->integer(''pick_detail_id'')->unsigned(); $table->foreign(''pick_detail_id'')->references(''id'')->on(''pick_details''); $table->integer(''original_qty'')->unsigned(); $table->integer(''shipped_qty'')->unsigned(); }); } public function down() { Schema::drop(''despatch_discrepancies''); }

Necesito cambiar esta tabla y soltar la referencia de clave externa y la columna pick_detail_id y agregar una nueva columna varchar llamada sku después de la columna pick_id .

Entonces, he creado otra migración, que se ve así:

public function up() { Schema::table(''despatch_discrepancies'', function($table) { $table->dropForeign(''pick_detail_id''); $table->dropColumn(''pick_detail_id''); $table->string(''sku'', 20)->after(''pick_id''); }); } public function down() { Schema::table(''despatch_discrepancies'', function($table) { $table->integer(''pick_detail_id'')->unsigned(); $table->foreign(''pick_detail_id'')->references(''id'')->on(''pick_details''); $table->dropColumn(''sku''); }); }

Cuando ejecuto esta migración, aparece el siguiente error:

[Iluminar / Base de datos / Excepción de consulta]
SQLSTATE [HY000]: Error general: 1025 Error al cambiar el nombre de ''./dev_iwms_reboot/despatch_discrepancies'' a ''./dev_iwms_reboot/#sql2-67c-17c464'' (errno: 152) (SQL: alter table despatch_discrepancies drop external key pick_detail_id)

[PDOException]
SQLSTATE [HY000]: Error general: 1025 Error al cambiar el nombre de ''./dev_iwms_reboot/despatch_discrepancies'' a ''./dev_iwms_reboot/#sql2-67c-17c464'' (error: 152)

Cuando trato de revertir esta migración ejecutando el comando php artisan migrate:rollback , recibo un mensaje Rolled back , pero en realidad no está haciendo nada en la base de datos.

¿Alguna idea de lo que podría estar mal? ¿Cómo se suelta una columna que tiene una referencia de clave externa?


Algo que se me ocurrió fue que no sabía dónde colocar el bloque de Schema::table .

Más tarde descubrí que la clave está en el error de SQL:

[Illuminate/Database/QueryException] SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table if exists `lu_benefits_categories`)

Por lo tanto, el bloque Schema::table debe ir en la función down() de la migración lu_benefits_categories y antes de la línea Schema::dropIfExists :

public function down() { Schema::table(''table'', function (Blueprint $table) { $table->dropForeign(''table_category_id_foreign''); $table->dropColumn(''category_id''); }); Schema::dropIfExists(''lu_benefits_categories''); }

Después de eso, php artisan migrate:refresh o php artisan migrate:reset hará el truco.


La clave (para mí) para resolver esto fue asegurarse de que el comando $ table-> dropForeign () recibiera el nombre de relación correcto, no necesariamente el nombre de la columna. No desea pasar el nombre de la columna, ya que sería mucho más intuitivo en mi humilde opinión.

Lo que funcionó para mí fue:

$table->dropForeign(''local_table_foreign_id_foreign''); $table->column(''foreign_id'');

Entonces, la cadena que pasé a dropForeign () que funcionó para mí tenía el formato de:

[tabla local] _ [campo de clave externa] _foreign

Si tiene acceso a una herramienta como Sequel Pro o Navicat, será muy útil poder visualizarlas.


Pase una matriz con col name

$table->dropForeign([''user_id'']);


Puedes usar esto:

$table->dropForeign([''pick_detail_id'']); $table->dropColumn(''pick_detail_id'');

Si toma un pico en la fuente dropForeign, generará el nombre del índice de clave externa para usted si pasa el nombre de la columna como una matriz.


Resulta; cuando creas una clave foránea como esta:

$table->integer(''pick_detail_id'')->unsigned(); $table->foreign(''pick_detail_id'')->references(''id'')->on(''pick_details'');

Laravel nombra de forma única la referencia de clave externa de esta manera:

<table_name>_<foreign_table_name>_<column_name>_foreign despatch_discrepancies_pick_detail_id_foreign (in my case)

Por lo tanto, cuando desee colocar una columna con referencia de clave externa, debe hacerlo así:

$table->dropForeign(''despatch_discrepancies_pick_detail_id_foreign''); $table->dropColumn(''pick_detail_id'');

Actualizar:

Laravel 4.2+ presenta una nueva convención de nomenclatura:

<table_name>_<column_name>_foreign


Tenía varias claves externas en mi tabla y luego tuve que eliminar las restricciones de clave externa una por una pasando el nombre de la columna como índice de la matriz en el método down:

public function up() { Schema::table(''offices'', function (Blueprint $table) { $table->unsignedInteger(''country_id'')->nullable(); $table->foreign(''country_id'') ->references(''id'') ->on(''countries'') ->onDelete(''cascade''); $table->unsignedInteger(''stateprovince_id'')->nullable(); $table->foreign(''stateprovince_id'') ->references(''id'') ->on(''stateprovince'') ->onDelete(''cascade''); $table->unsignedInteger(''city_id'')->nullable(); $table->foreign(''city_id'') ->references(''id'') ->on(''cities'') ->onDelete(''cascade''); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table(''offices'', function (Blueprint $table) { $table->dropForeign([''country_id'']); $table->dropForeign([''stateprovince_id'']); $table->dropForeign([''city_id'']); $table->dropColumn([''country_id'',''stateprovince_id'',''city_id'']); }); }

Usar la siguiente declaración no funciona

$table->dropForeign([''country_id'',''stateprovince_id'',''city_id'']);

Porque dropForeign no los considera columnas separadas que queremos eliminar. Entonces tenemos que soltarlos uno por uno.