web-dev-qa-db-fra.com

Laravel Schema onDelete set null

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!

87
M K

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();
248
Johan

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

5
Chris Barrett
  • C'est un problème connu à Laravel. Plus d'informations à ce sujet ici .

  • Cette fonctionnalité n'est pas supportée dans SQLite, voir ici

  • Aussi un sujet qui a une confrontation détaillée de ce problème

5
M K

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

3
Mark Kendall