Laravel Schema onDelete establece nulo

3 minutos de lectura

avatar de usuario
MK

No puedo entender cómo establecer la restricción onDelete adecuada 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";
});

Creación de 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 portada, no se eliminará la galería (para fines de prueba).

Dado que incluso la “cascada” no se activa, “configuré nulo” no es el problema.

EDITAR (solución alternativa):

Después de leer esto artículo 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.

¡Todavía se aprecia mucho una solución al problema original!

Si desea establecer nulo en la eliminación:

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

Primero asegúrese de configurar el campo de clave externa como anulable:

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

  • más para ->nullable()

    – mohsenjsh

    16 de febrero de 2016 a las 11:59

  • ¿Hay alguna documentación de Laravel o esto?

    -Chuck Le Butt

    18 de febrero de 2019 a las 19:44

  • laravel.com/docs/6.x/migrations#foreign-key-constraints no documenta qué opciones hay, pero creo que puede asumir que son los valores predeterminados de mysql (ver ../ vendor / laravel / framework / src / Illuminate / Database / Schema / Grammars / Grammar.php)

    – DirkJan

    23 de marzo de 2020 a las 14:47

avatar de usuario
Ayman Elshehawy

En laravel 8 puedes usar:

$table->foreignId('forign_id')->nullable()->constrained("table_name")->cascadeOnUpdate()->nullOnDelete();

Referencia

Las diferentes opciones se declaran en clase. Illuminate\Database\Schema\ForeignKeyDefinition (ver fuente).

  • Probado con Laravel 7, también funciona allí.

    – gabelbart

    22 de noviembre de 2021 a las 11:49

avatar de usuario
MK

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

  • Esta característica no es compatible con SQLite, consulte aquí

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

  • @SimonBengtsson El problema debe haberse cerrado o eliminado.

    – MK

    28 de agosto de 2014 a las 9:58

De acuerdo a

http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-restricciones.html

$table->onDelete(‘set null’) debería funcionar tal vez intente

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

Si hay algún error, también sería útil.

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

avatar de usuario
Ali Akbar Afridi

en laravel 8 puedes hacerlo así.

 $table->foreignId('table_id')->nullable()->constrained()->onDelete('set null');

Los modificadores de columna anulable() deben llamarse antes de constreined() y onDelete(‘set null’)

avatar de usuario
AmirRezaM75

SQLite no admite la variante ADD CONSTRAINT del comando ALTER TABLE

La clave externa de SQLite no establece un valor nulo al eliminar en la prueba de phpunit

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad