🐥

Laravel 一対多で入れた画像ファイルを一緒に消す

2021/02/26に公開

Laravel(5.8)で、一つの記事に対し複数の画像がアップしたい。

https://qiita.com/netfish/items/ef01cdb5f58742563e87

こちらを参考に記事の登録まで出来ました。
※以降のソースは上記記事を参考にしていますが、photos()の部分をimages()に読み替えてください

記事の削除機能もつけたい(物理削除)のですが単純に記事のidのみでdeleteしようとしても失敗します。

親記事を削除する前に子を削除


    public function destroy($id)
    {
        $item = Item::find($id);
        $item->images()->delete();
        $item->delete();

        \Session::flash('flash_message', '記事を削除しました。');
        return redirect('admin/item');
    }

itemが親でimagesが子になります。先に子であるimagesを削除することでエラーなく親も子も消すことが出来ました。

画像も消したい

単純な親子関係ならこれで解決ですが、今回はdb部分だけでなく、画像もアップしているのでそれも消さなければなりません。

    public function destroy($id)
   {
       $item = Item::find($id);
   
       foreach ($item['images'] as $image) {
   	//$image['path']に画像パス情報
           \Storage::delete($image['path']);
       }
       $item->images()->delete();
       $item->delete();

       \Session::flash('flash_message', '記事を削除しました。');
       return redirect('admin/item');
   }

deleteする前にforeachでパスを調べ、Storage::deleteすることで関連する全ての画像を削除できます

Discussion