🐈
[misucfile削除機能] 外部キー制約で付けられたコメントが一緒に削除できない
調査
nuxt側
ログインユーザーが自分のプロフィールを見た時のみ削除ボタンが表示されるようにする
laravel
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
外部キーの子要素も同時に削除できるようにする
これ元々設定してあった
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');
});
}
論理削除、物理削除
関係なさそう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から音声データと画像も削除したい
解決
cascade設定がマイグレーションでうまくできていない買った(typoが原因)
マイグレーションしなおして解決
Discussion