Schema Laravel onDelete impostato nullo


112

Non riesco a capire come impostare il corretto vincolo onDelete su una tabella in Laravel. (Sto lavorando con SqLite)

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

Ho 3 migrazioni, creando la tabella della galleria:

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';
});

Creazione della tabella delle immagini:

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';
});

Collegamento della tabella della galleria a un'immagine:

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
});

Non ricevo errori. Inoltre, anche l'opzione "cascata" non funziona (solo nella tabella della galleria). L'eliminazione di una galleria elimina tutte le immagini. Ma eliminando l'immagine di copertina, non cancellerà la galleria (a scopo di test).

Dal momento che anche la "cascata" non viene attivata, "imposto null" non è il problema.

MODIFICA (soluzione alternativa):

Dopo aver letto questo articolo ho cambiato un po 'il mio schema. Ora, la tabella delle immagini contiene una cella "is_cover", che indica se questa immagine è o meno una copertina del suo album.

Una soluzione al problema originale è ancora molto apprezzata!

Risposte:


318

Se vuoi impostare null all'eliminazione:

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

Innanzitutto assicurati di impostare il campo della chiave esterna come nullable:

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

37
più per->nullable()
mohsenJsh

3
C'è della documentazione Laravel su questo?
Chuck Le Butt

laravel.com/docs/6.x/migrations#foreign-key-constraints non documenta quali opzioni ci sono, ma penso che tu possa presumere che siano i valori mysql predefiniti (vedi ../ vendor / laravel / framework / src / Illuminate / Database / Schema / Grammars / Grammar.php)
Dirk Jan

6
  • Questo è un problema noto in Laravel. Maggiori informazioni su questo qui .

  • Questa funzione non è supportata in SQLite, vedere qui

  • Anche un argomento che ha una resa dei conti dettagliata di questo problema


1
@SimonBengtsson Il problema deve essere stato chiuso o eliminato.
MK

5

Secondo

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

$ table-> onDelete ('set null') dovrebbe funzionare, forse provare

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

Se ci sono errori, sarebbe utile anche


Potresti voler eseguire il rollback, scrivere lo sql a mano e quindi eseguire l'execture ed eseguire test in locale. Tutto quello che riesco a trovare dice che dovrebbe funzionare dev.mysql.com/doc/refman/5.6/en/… , potrebbe essere un problema che genera lo sql
Chris Barrett

Grazie! Purtroppo ha provocato lo stesso problema. Penso che sia qualcosa di specifico per SqLite e riferimenti circolari.
MK

Più uno perché onDelete ('set null') funziona con mysql.
Simon Bengtsson

3

Usando Laravel 4.2 su MySQL 5.5 con InnoDB, onDelete ('set null') funziona.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.