Laravel Schema onDelete set null

ne peut pas comprendre comment définir une contrainte onDelete appropriée sur une table dans Laravel. (Je travaille avec SqLite)

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

j'ai 3 migrations, créant la table de la galerie:

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

création de la table d'images:

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

reliant une table de galerie à une image:

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

Je ne reçois aucune erreur. En outre, même l'option "cascade" ne fonctionne pas (seulement sur la galerie table.) La suppression d'une galerie supprime toutes les images. Mais Supprimer l'image de couverture, ne supprimera pas la galerie (pour des raisons de test).

puisque même la" cascade "n'est pas déclenchée, Je" set null " n'est pas le problème.

MODIFIER (contournement):

après avoir lu cet" article 1519210920 j'ai un peu changé mon schéma. Maintenant, la table des images contient une cellule "is_cover", qui indique si ceci picture est une pochette de son album ou pas.

Une solution pour le problème d'origine est toujours très appréciée!

72
demandé sur Brian Tompsett - 汤莱恩 2014-01-01 17:23:42

4 réponses

si vous voulez définir null sur Supprimer:

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

assurez-vous D'abord que le champ de clé étrangère est nul:

$table->integer('foreign_id')->unsigned()->nullable();
203
répondu Johan 2014-09-10 12:46:23

selon

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

$table->onDelete('set null') devrait peut-être même essayer de

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

S'il y a des erreurs, serait également utile

4
répondu Chris Barrett 2014-01-01 13:32:25

utilisant Laravel 4.2 sur MySQL 5.5 avec InnoDB, onDelete('set null') fonctionne.

2
répondu Mark Kendall 2014-08-26 10:25:28
  • C'est un problème connu à Laravel. Plus d'informations sur ce ici .

  • cette fonctionnalité n'est pas prise en charge dans SQLite, voir ici

  • Aussi un sujet qui a détaillé épreuve de force de ce problème

2
répondu M K 2017-05-23 12:18:25