LaravelスキーマonDeleteセットnull


112

Laravelのテーブルに適切なonDelete制約を設定する方法がわかりません。(私はSqLiteを使用しています)

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

私は3つのマイグレーションを行い、ギャラリーテーブルを作成します。

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

picturesテーブルの作成:

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

ギャラリーテーブルを画像にリンクする:

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

エラーは発生しません。また、「カスケード」オプションでも機能しません(ギャラリーテーブルでのみ)。ギャラリーを削除すると、すべての画像が削除されます。ただし、カバー画像を削除しても、ギャラリーは削除されません(テスト目的)。

「カスケード」もトリガーされないので、「nullを設定」は問題ではありません。

編集(回避策):

この記事を読んだ後を、スキーマを少し変更しました。これで、picturesテーブルには「is_cover」セルが含まれ、この写真はアルバムのカバーであるかどうかを示します。

元の問題の解決策は依然として高く評価されています!

回答:


317

削除時にnullを設定する場合:

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

まず、外部キーフィールドをnull可能として設定してください。

$table->integer('foreign_id')->unsigned()->nullable();

37
プラス->nullable()
mohsenJsh

3
これにLaravelのドキュメントはありますか?
チャックルバット

laravel.com/docs/6.x/migrations#foreign-key-constraintsにはどのようなオプションがあるかは記載されていませんが、それがデフォルトのmysql値であると想定できます(を参照../ vendor / laravel / framework / src / Illuminate / Database / Schema / Grammars / Grammar.php
Dirk Jan

6
  • これはLaravelの既知の問題です。これに関する詳細はこちら

  • この機能はSQLiteではサポートされていません。こちらを参照してください

  • この問題の詳細な対決があるトピック


1
@SimonBengtsson問題はクローズまたは削除されている必要があります。
MK

5

による

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

$ table-> onDelete( 'set null')はおそらく動作するはずです

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

エラーがある場合も参考になります


ロールバックし、SQLを手動で書き出してから、ローカルで実行してテストを実行することができます。私が見つけることができるすべてはdev.mysql.com/doc/refman/5.6/en/…で動作するはずであると言っていますが、SQLを生成する問題である可能性があります
Chris Barrett

ありがとう!残念ながら、同じ問題が発生しました。SqLiteと循環参照に固有の何かだと思います。
MK

さらに、onDelete( 'set null')がmysqlで動作するためです。
Simon Bengtsson 2014

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.