LoginSignup
1
2

More than 3 years have passed since last update.

(続)Controllerからs3に保存されている画像を削除する(Laravel)

Last updated at Posted at 2020-06-07

はじめに

前記事「チャットアプリで、1グループのメッセージ数上限を50件にする(Laravel)」の続きです。
前回の内容はメッセージが50件を超えた場合自動で古いメッセージを削除するコードです。削除するのは古いメッセージレコード(messagesテーブルのデータ)です。

画像の送受信の仕組み

画面としては下図です。
スクリーンショット 2020-06-07 12.37.46.png
「ファイルを選択」で画像を選択し、「送信」をクリックすると画像はcontrollerでs3に保存します。
画像が保存されたs3のリンクをimage_pathカラムに保存します。ファイル名の前にpathをつけて保存します。https://バケット名.s3.us-east-2.amazonaws.com/ファイルハッシュ名.jpegのような要領です。
画像を表示する際は、blade.phpに<img>タグで呼び出します。
「s3への保存の仕方」など細かい部分は飛ばして書きました。需要があるなら追々別記事で書こうと思います。

コード

早速コードを載せます。いわゆる結論ファーストです。
動くまでにいろいろエラーがありましたが、ほぼ凡ミスだったので書きません。

GroupController.php@send
$count = $message->where('group_id',$_POST['group_id'])->count();
          if ($count > 50) {
            $message50 = DB::table('messages')
            ->where('group_id', $_POST['group_id'])
            ->orderBy('id','desc')
            ->take(50);
            $deleteid = $message50->pluck('id')->min();
            $messageins = message::where('group_id',$_POST['group_id']);
            $deletemessage = $messageins->where('id','<',$deleteid);            
            $image = $deletemessage->pluck('image_path');            
            foreach($image as $item){
              if($item !== null){
                $item = basename($item);
                $disk = Storage::disk('s3');
                $disk->delete('/', $item);
              }
            }          
            $deletemessage->delete();
          }

解説

前記事と異なる部分はforeach以降ですね。
$image = $deletemessage->pluck('image_path');によってimage_pathのみで構成された配列$imageを作ります。もちろん画像なしメッセージであれば、image_pathカラムにはnullで保存されますね。
「BppGmL1UlOZ28bkpEKmX4ik0LoK45FcEuIzJQgcP.jpeg」というキー名でs3に保存されたファイルを削除したいのなら、
$disk = Storage::disk('s3');
$disk->delete('/BppGmL1UlOZ28bkpEKmX4ik0LoK45FcEuIzJQgcP.jpeg');と書きます。
これのキー名を変数に置き換えるだけです。foreachとifを使って、imageカラムのファイルを次々削除していきます。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2