Impossible de 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 du tableau des 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';
});
Lier la table de la 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. De plus, même l'option "cascade" ne fonctionne pas (uniquement sur la table de la galerie). La suppression d'une galerie supprime toutes les images. Mais la suppression de l'image de couverture ne supprimera pas la galerie (à des fins de test).
Etant donné que même la "cascade" n'est pas déclenchée, je "set null" n'est pas le problème.
EDIT (solution de contournement):
Après avoir lu cet article, j'ai un peu changé mon schéma. Maintenant, le tableau des images contient une cellule "is_cover", qui indique si cette image est une couverture de son album ou non.
Une solution au problème d'origine est toujours très appréciée!
->nullable()