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」セルが含まれ、この写真はアルバムのカバーであるかどうかを示します。
元の問題の解決策は依然として高く評価されています!
->nullable()