はじめに
前記事「チャットアプリで、1グループのメッセージ数上限を50件にする(Laravel)」の続きです。
前回の内容はメッセージが50件を超えた場合自動で古いメッセージを削除するコードです。削除するのは古いメッセージレコード(messagesテーブルのデータ)です。
画像の送受信の仕組み
画面としては下図です。
「ファイルを選択」で画像を選択し、「送信」をクリックすると画像はcontrollerでs3に保存します。
画像が保存されたs3のリンクをimage_pathカラムに保存します。ファイル名の前にpathをつけて保存します。 https://バケット名.s3.us-east-2.amazonaws.com/ファイルハッシュ名.jpeg
のような要領です。
画像を表示する際は、blade.phpに<img>
タグで呼び出します。
「s3への保存の仕方」など細かい部分は飛ばして書きました。需要があるなら追々別記事で書こうと思います。
コード
早速コードを載せます。いわゆる結論ファーストです。
動くまでにいろいろエラーがありましたが、ほぼ凡ミスだったので書きません。
$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カラムのファイルを次々削除していきます。