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!
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();
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
utilisant Laravel 4.2 sur MySQL 5.5 avec InnoDB, onDelete('set null') fonctionne.