web-dev-qa-db-ja.com

Laravel Schema onDelete set null

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

写真テーブルの作成:

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を設定」は問題になりません。

EDIT(回避策):

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

元の問題の解決策はまだ高く評価されています!

87
M K

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

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

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

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

による

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

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

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

エラーがあれば、また役立つでしょう

5
Chris Barrett
  • これはLaravelの既知の問題です。これに関する詳細情報 こちら

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

  • また、この問題の詳細な対決がある topic

5
M K

InnoDBを使用するMySQL 5.5でLaravel 4.2を使用すると、onDelete( 'set null')が機能します。

3
Mark Kendall