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!
De acuerdo a
http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html
$ table-> onDelete (''set null'') debería funcionar, quizás intente
$table->...->onDelete(DB::raw(''set null''));
Si hay algún error, también sería útil
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.