migrations foreign delete column php laravel laravel-migrations

php - foreign - nullable laravel



Laravel Schema onDelete establece null (4)

No se puede encontrar la manera de establecer la restricción correcta de eliminación en una tabla en Laravel. (Estoy trabajando con SqLite)

$table->...->onDelete(''cascade''); // works $table->...->onDelete(''null || set null''); // neither of them work

Tengo 3 migraciones, creando la tabla de la galería:

Schema::create(''galleries'', function($table) { $table->increments(''id''); $table->string(''name'')->unique(); $table->text(''path'')->unique(); $table->text(''description'')->nullable(); $table->timestamps(); $table->engine = ''InnoDB''; });

Creando la tabla de imágenes:

Schema::create(''pictures'', function($table) { $table->increments(''id''); $table->text(''path''); $table->string(''title'')->nullable(); $table->text(''description'')->nullable(); $table->integer(''gallery_id'')->unsigned(); $table->foreign(''gallery_id'') ->references(''id'')->on(''galleries'') ->onDelete(''cascade''); $table->timestamps(); $table->engine = ''InnoDB''; });

Vinculación de la tabla de la galería a una imagen:

Schema::table(''galleries'', function($table) { // id of a picture that is used as cover for a gallery $table->integer(''picture_id'')->after(''description'') ->unsigned()->nullable(); $table->foreign(''picture_id'') ->references(''id'')->on(''pictures'') ->onDelete(''cascade || set null || null''); // neither of them works });

No recibo ningún error Además, incluso la opción "cascada" no funciona (solo en la mesa de la galería). Al eliminar una galería, se eliminan todas las imágenes. Pero al eliminar la imagen de la portada, no se eliminará la galería (para fines de prueba).

Dado que incluso la "cascada" no se activa, "establecer nulo" no es el problema.

EDITAR (solución alternativa):

Después de leer este article , he cambiado un poco mi esquema. Ahora, la tabla de imágenes contiene una celda "is_cover", que indica si esta imagen es una portada en su álbum o no.

¡Una solución al problema original aún es muy apreciada!



Si quiere establecer null en delete:

$table->...->onDelete(''set null'');

Primero asegúrese de establecer el campo de la clave externa como nulable:

$table->integer(''foreign_id'')->unsigned()->nullable();


Usando Laravel 4.2 en MySQL 5.5 con InnoDB, onDelete (''set null'') funciona.


  • Este es un problema conocido en Laravel. Más información sobre esto here .

  • Esta característica no es compatible con SQLite, mira here

  • También un topic que tiene un enfrentamiento detallado de este problema