Laravel Schema onDelete set null

Lesezeit: 3 Minuten

Benutzer-Avatar
MK

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

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

Ich habe 3 Migrationen und erstelle die Galerietabelle:

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

Bildertabelle erstellen:

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

Galerietabelle mit einem Bild verknüpfen:

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 “Cascade” funktioniert nicht (nur auf dem Galerietisch). Beim Löschen einer Galerie werden alle Bilder gelöscht. Aber das Löschen des Titelbildes löscht nicht die Galerie (für Testzwecke).

Da auch die “Kaskade” nicht ausgelöst wird, habe ich “Null setzen” nicht das Problem.

BEARBEITEN (Problemumgehung):

Nachdem ich das gelesen habe Artikel Ich habe mein Schema etwas geändert. Jetzt enthält die Bildertabelle eine “is_cover”-Zelle, die angibt, ob dieses Bild ein Cover auf seinem Album ist oder nicht.

Eine Lösung des ursprünglichen Problems wird immer noch sehr geschätzt!

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

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

Stellen Sie zunächst sicher, dass Sie das Fremdschlüsselfeld als nullable festlegen:

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

  • plus für ->nullable()

    – mohsenJsh

    16. Februar 2016 um 11:59 Uhr

  • Gibt es eine Laravel-Dokumentation dazu?

    – Chuck Le Butt

    18. Februar 2019 um 19:44 Uhr

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

    – Dirk Jan

    23. März 2020 um 14:47 Uhr

Benutzer-Avatar
Ayman Elshehawy

In Laravel 8 können Sie verwenden:

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

Bezug

Die verschiedenen Optionen werden in der Klasse deklariert Illuminate\Database\Schema\ForeignKeyDefinition (siehe Quelle).

  • Getestet mit Laravel 7, funktioniert auch dort.

    – Gabelbart

    22. November 2021 um 11:49 Uhr

Benutzer-Avatar
MK

  • 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

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

    – MK

    28. August 2014 um 9:58 Uhr

Entsprechend

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

$table->onDelete(‘set null’) sollte funktionieren, versuchen Sie es vorher

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

Wenn es irgendwelche Fehler gibt, wäre auch hilfreich

Bei Verwendung von Laravel 4.2 auf MySQL 5.5 mit InnoDB funktioniert onDelete(‘set null’).

Benutzer-Avatar
Ali Akbar Afridi

In Laravel 8 kannst du es so machen.

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

nullable()-Spaltenmodifikatoren müssen vor constrained() und onDelete(‘set null’) aufgerufen werden

Benutzer-Avatar
AmirRezaM75

SQLite unterstützt die ADD CONSTRAINT-Variante des ALTER TABLE-Befehls nicht

SQLite-Fremdschlüssel setzt beim Löschen im PHPunit-Test nicht null

1360530cookie-checkLaravel Schema onDelete set null

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy