1. ホーム
  2. php

[解決済み] Laravel Schema onDelete は null を設定します。

2022-05-10 22:50:08

質問

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

エラーは出ていません。また、"cascade"オプションも効きません(ギャラリーテーブルのみ)。ギャラリーを削除すると、すべての写真が削除されます。しかし、カバー画像を削除しても、ギャラリーは削除されません(テスト目的)。

cascade" さえもトリガーされないので、私は "set null" が問題ではありません。

EDIT(回避策)。

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

元の問題に対する解決策は、今でも非常に高く評価されています。

解決方法は?

削除時にNULLを設定したい場合。

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

まず、外部キーフィールドをNullableに設定することを確認します。

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