[解決済み] 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();
関連
-
[解決済み】PHP - 構文エラー、予期しないT_CONSTANT_ECAPSED_STRING [閉店].
-
[解決済み] [Solved] Fatal error: メンバ関数prepare()のNULLでの呼び出し
-
[解決済み] コマンドの同期がとれていない。
-
[解決済み】メンバ関数をnullで呼び出す?
-
[解決済み】XAMPPのphpMyAdminで「設定にあるcontroluserの接続に失敗しました。
-
[解決済み】PHPからPythonスクリプトを実行する
-
[解決済み】mysqli_select_db()は、パラメータ1がmysqliであることを期待し、文字列が与えられる。
-
thinkphp5 timestamp 非整形の数値に遭遇した。
-
[解決済み] オートロードとは何ですか; spl_autoload、__autoload、spl_autoload_register はどのように使うのですか?
-
[解決済み] Laravel マイグレーションで既存のテーブルに新しいカラムを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] Fatal error: メンバ関数bind_param()のbooleanに対する呼び出し [重複] [重複
-
[解決済み】PHPで空の値からデフォルトオブジェクトを作成する?
-
[解決済み】空の配列要素を削除する
-
[解決済み] SAJAXは死んだか?何を置き換えるべきか?
-
[解決済み] [Solved] Fatal error: メンバ関数 query() の null への呼び出し。
-
phpのAllowed memory size of 134217728 bytes枯渇問題の解決法
-
[解決済み】MySQLのカラム数が1行目の値数と一致しない【非公開
-
[解決済み] PHP と mod_fcgid: handle_request_ipc 関数で ap_pass_brigade が失敗する。
-
[解決済み] SSLエラー SSL3_GET_SERVER_CERTIFICATE:証明書の検証に失敗しました。
-
[解決済み] 既存のSQLiteテーブルに外部キーを追加するにはどうすればよいですか?