プログラミング学習292日目〜Laravel 自動車整備履歴アプリ修正 画像削除〜
画像のデータベースへの登録、アップロードもなかなか大変でしたが(https://note.com/pinyo/n/n16654735681d)、それらの削除もなかなか大変でした。
ルート
Route::get('/carinfo/delete/{id}',[CarinfoController::class, 'deleteImage']);
コントローラー
public function deleteImage($id)
{
//ログインユーザーid取得
$user_id = Auth::id();
//削除するidの車輌情報
$delItem = carinfo::find($id);
//削除するファイル名を取得
$delFaileName = $delItem->image;
// dd($delItem);
if(Storage::exists("public/car_image/$user_id/$delFaileName")){
//画像ファイルを削除
Storage::delete("public/car_image/$user_id/$delFaileName");
//imageカラムにnullを登録
$delItem->image = null;
$delItem->save();
}
\Session::flash('err_msg', '画像を削除しました');
return redirect("/carinfo/edit/$id");
}
storageの画像ファイルの削除は比較的早くできたのですが、データベースの変更に手間取りました。ググり方が下手なせいか、指定したidの全データを削除する方法はよくヒットするのですが、指定したidの指定したカラムのデータを空にする方法がヒットしなくてどうしたものかと思い、やったことが上のコード。
新規登録で画像データを登録しないとそこのカラムはnullが入るので、そのカラムのデータを消すというより、nullを登録するという考え方に切り替えました。結果的にこれで動作しているので問題ないような気はするのですが、果たしてこのやり方が一般的なのかどうかはわかりません。
ビュー
@if (!$carinfo->image)
<p><input type="file" name="image" id="01" value="{{ $carinfo->image }}"></p>
@endif
@if ($carinfo->image)
<img src="{{ asset("/storage/car_image/$user_id/$carinfo->image") }}" width="300px" alt="車輌画像">
@endif
@if ($carinfo->image)
<p><a class="btn btn-danger" href="/carinfo/delete/{{$carinfo->id}}" onclick="return checkDelete()">画像を削除</a></p>
@endif
<script>
function checkDelete(){
if(window.confirm('車輌画像を削除してよろしいですか?')){
return true;
} else {
return false;
}
}
</script>
<a>でリンク先に飛ばしてコントローラーの処理をするようにしています。
ここでひとつハマったというか悩んだことがあります。
@if ($carinfo->image)この部分。
なんとなくデータベースから取得するデータに関しては{{ }}を使ってエスケープしないといけないものと思っていて、
@if ({{$carinfo->image}})
こうしていたのですが、これだとエラーが出たり、思うような動きをしてくれません。これについてもググってみたのですが、その理由にはたどり着けませんでした。
ただ何となく感じるのは、エスケープする必要がないからなのではということ。表示させるわけでなく、あるかないかを判断させるだけなので、エスケープさせる必要はないような気がします。なのでとりあえずそういうことにしておきます。
この記事が気に入ったらサポートをしてみませんか?