🐈

[misucfile削除機能] 外部キー制約で付けられたコメントが一緒に削除できない

2021/11/21に公開約2,400字

調査

nuxt側
ログインユーザーが自分のプロフィールを見た時のみ削除ボタンが表示されるようにする

laravel

https://qiita.com/ohmoto_2020/items/8cd92e08be5a28d8a053
DBとs3から削除する

misucfile削除api作成
src/routes/api.php

    Route::post('deleteMusicfile/{user_id}', 'MusicFileController@musicFileDestroy');

src/app/Http/Controllers/MusicFileController.php

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function musicFileDestroy($music_file_id)
    {
        MusicFile::destroy($music_file_id);
    }

以下エラー発生
音声ファイルにされたコメントが外部キー制約で一緒に削除できない

Illuminate\Database\QueryException: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`sample`.`comments`, CONSTRAINT `comments_music_file_id_foreign` FOREIGN KEY (`music_file_id`) REFERENCES `music_files` (`id`)) (SQL: delete from `music_files` where `id` = 11) in file /var/www/html/src/vendor/laravel/framework/src/Illuminate/Database/Connection.php on line 669

試すこと

cascade
外部キーの子要素も同時に削除できるようにする

https://smspp.hatenablog.jp/entry/2019/03/23/202942
これ元々設定してあった
src/database/migrations/2021_08_22_174202_create_comments_table.php
    public function up()
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('text');
            $table->unsignedBigInteger('user_id')->nullable();
            $table->unsignedBigInteger('music_file_id')->nullable();
            $table->timestamps();

            $table->foreign('user_id')
                  ->references('id')->on('users')
                  ->OnDelete('cascade');
            $table->foreign('music_file_id')
                  ->references('id')->on('music_files')
                  ->OnDelete('cascade');

        });
    }

論理削除、物理削除

https://teratail.com/questions/273050
関係なさそう

cascadeで削除されないのでひとまず該当音声ファイルについているコメントを強制削除

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function musicFileDestroy(Request $request)
    {
        // cascadeで削除されないのでひとまず該当音声ファイルについているコメントを強制削除
        Comment::where('music_file_id', '=', $request->id)->delete();
        MusicFile::destroy($request->id);
    }

特定のファイルでコメントだけ消えるという現象が発生

忘れてたけどDBのパスだけじゃなくてs3から音声データと画像も削除したい

https://qiita.com/ohmoto_2020/items/8cd92e08be5a28d8a053

解決

cascade設定がマイグレーションでうまくできていない買った(typoが原因)
マイグレーションしなおして解決

Discussion

ログインするとコメントできます