146

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

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

「カスケード」すらトリガーされないので、「set null」は問題ありません。

編集(回避策):

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

元の問題に対する解決策は、依然として高く評価されています。

4

8 に答える 8

389

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

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

まず、外部キー フィールドを null 許容として設定していることを確認します。

$table->integer('foreign_id')->unsigned()->nullable();
于 2014-09-10T12:46:23.547 に答える
6
于 2014-01-02T00:40:11.153 に答える
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'));

間違いがあればこちらも参考になります

于 2014-01-01T13:32:25.243 に答える
3

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

于 2014-08-26T10:25:28.957 に答える