Impossible de comprendre comment définir la 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 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';
});
Lier un tableau 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. En outre, même l'option "cascade" ne fonctionne pas (uniquement sur la table gallery). La suppression d'une galerie supprime toutes les images. Mais supprimer la photo 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 ne suis pas "réglé sur null".
EDIT (solution de contournement):
Après avoir lu ceci article j'ai un peu modifié mon schéma. La table d'images contient maintenant une cellule "is_cover", qui indique si cette image est une couverture de son album ou non.
Une solution au problème initial est toujours très appréciée!
Si vous souhaitez définir null sur delete:
$table->...->onDelete('set null');
Tout d’abord, assurez-vous de définir le champ de la clé étrangère sur nullable:
$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 fonctionner avant d'essayer
$table->...->onDelete(DB::raw('set null'));
S'il y a des erreurs, serait également utile
Utiliser Laravel 4.2 sur MySQL 5.5 avec InnoDB, onDelete ('set null') fonctionne.