Laravel Schema onDelete setzt null


111

Ich kann nicht herausfinden, wie die richtige onDelete-Einschränkung für eine Tabelle in Laravel festgelegt wird. (Ich arbeite mit SqLite)

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

Ich habe 3 Migrationen, die die Galerietabelle erstellen:

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

Erstellen der Bildtabelle:

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

Verknüpfen der Galerietabelle mit einem Bild:

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

Ich erhalte keine Fehler. Auch die Option "Kaskade" funktioniert nicht (nur für den Galerietisch). Durch Löschen einer Galerie werden alle Bilder gelöscht. Wenn Sie jedoch das Titelbild löschen, wird die Galerie nicht gelöscht (zu Testzwecken).

Da auch die "Kaskade" nicht ausgelöst wird, ist "Null setzen" nicht das Problem.

BEARBEITEN (Problemumgehung):

Nachdem ich diesen Artikel gelesen habe, habe ich mein Schema ein wenig geändert. Jetzt enthält die Bildtabelle eine "is_cover" -Zelle, die angibt, ob dieses Bild ein Cover auf seinem Album ist oder nicht.

Eine Lösung für das ursprüngliche Problem wird immer noch sehr geschätzt!

Antworten:


316

Wenn Sie beim Löschen null setzen möchten:

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

Stellen Sie zunächst sicher, dass Sie das Fremdschlüsselfeld auf null setzen:

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

37
plus für->nullable()
mohsenJsh

3
Gibt es eine Laravel-Dokumentation dazu?
Chuck Le Butt

laravel.com/docs/6.x/migrations#foreign-key-constraints dokumentiert nicht, welche Optionen es gibt, aber ich denke, Sie können davon ausgehen, dass es sich um die Standard-MySQL-Werte handelt (siehe ../ vendor / laravel / framework / src / Illuminate / Database / Schema / Grammars / Grammar.php)
Dirk,

6
  • Dies ist ein bekanntes Problem in Laravel. Mehr Infos dazu hier .

  • Diese Funktion wird in SQLite nicht unterstützt (siehe hier)

  • Auch ein Thema , das einen detaillierten Showdown dieses Problems enthält


1
@ SimonBengtsson Das Problem muss geschlossen oder gelöscht worden sein.
MK

5

Gemäß

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

$ table-> onDelete ('set null') sollte funktionieren, bevor Sie es versuchen

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

Wenn es irgendwelche Fehler gibt, wäre das auch hilfreich


Möglicherweise möchten Sie ein Rollback durchführen, die SQL von Hand ausschreiben und dann lokale Tests durchführen und ausführen. Alles, was ich finden kann, sagt, dass dev.mysql.com/doc/refman/5.6/en/… funktionieren sollte , könnte ein Problem sein, das die SQL generiert
Chris Barrett

Vielen Dank! Leider führte dies zu demselben Problem. Ich denke, es ist etwas Spezifisches für SqLite und Zirkelverweise.
MK

Plus eins, weil onDelete ('set null') mit MySQL funktioniert.
Simon Bengtsson

3

Unter Verwendung von Laravel 4.2 unter MySQL 5.5 mit InnoDB funktioniert onDelete ('set null').

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.