hi_lili
@hi_lili

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

laravel 編集した時、変更していない画像の保持をしたい!

Q&A

Closed

###使用環境
laravel 9
Laravel ui
composer
MacOS
PHP
JS使用せず

解決したいこと

編集後も画像の保持をしたい!

発生している問題・エラー

編集を行った際に、画像も変更すると上手く動作するのですが、
画像はそのままで、その他カラムを変更し保存すると、
セットされている画像カラムだけ削除され、画像の保持ができません。
(説明下手ですいません・・・。:bow_tone1:

ProductController.php

public function update(ProductRequest $request, Product $product)
    {
        $request->validate([
            'product_name' => 'required',
            'company_id' => 'required',
            'price' => 'required',
            'stock' => 'required',
            'comment' => 'nullable',
            'img_path' => 'nullable|image|max:2048',
        ]);

        $product->product_name = $request->product_name;
        $product->company_id = $request->company_id;
        $product->price = $request->price;
        $product->stock = $request->stock;
        $product->comment = $request->comment;
        $product->img_path = $request->file('img_path');
        
        $filePath = $product->img_path;
        if(isset($product->img_path)){
            \Storage::disk('public')->delete($filePath);
            $filePath = $product->img_path;
                if($request->hasFile('img_path')){
                    $filename = $request->img_path->getClientOriginalName();
                    $filePath = $request->img_path->storeAs('products', $filename, 'public');
                    $product->img_path = '/storage/' . $filePath;    
                }
        }

編集の画像の部分は以下となります。

edit.blade.php
     <div class="mb-3">
        <label for="img_path" class="form-label">商品画像:</label>
        <input id="img_path" type="file" name="img_path" class="form-control">
        <img src="{{ asset($product->img_path) }}" alt="商品画像" width="100" class="product-image">
    </div>

自分で試したこと

ストレージの画像削除まではおそらく動作しているかと思いますが、
画像を維持?というより、再度画像のパスを取得できていないのかなぁっと思ったりしています。

また、変更を加えなかえれば元々セットされている画像パスが残るようにできれば、そもそもこんなことを考えなくてもいいだろうなぁ・・・っとも思います
ただ検索してもあまりわからずご教授頂けますとさいわいです:bow_tone1:
よろしくお願いいたします:bow_tone1:

0

1Answer

変更を加えなかえれば元々セットされている画像パスが残るようにできれば

変更を加えたときだけ$product->img_pathを上書きすればいいのではないでしょうか。

編集で起こり得るのは次の状態の組み合わせです。

  • 現在画像が登録されているか、いないか
  • 新しい画像が設定されるか、されないか

どの状態のときに、どのような処理をするか、整理するのが良いと思います。

1Like

Comments

  1. @hi_lili

    Questioner

    @blue32a

    いつもご教授いただきありがとうございます!:bow_tone1:
    おっしゃる通り、どの処理を行うのか切り分けて記述すると上手く動貸すことができました!

    具体的には、
    if文の中に、if文を入れていたものを外に出すことで動かすことができました!

            if(isset($product->img_path)){
            $filePath = $product->img_path;
            \Storage::disk('public')->delete($filePath);
            }
    
            // $filePath = $product->img_path;
            if($request->hasFile('img_path')){
            $filename = $request->img_path->getClientOriginalName();
            $filePath = $request->img_path->storeAs('products', $filename, 'public');
            $product->img_path = '/storage/' . $filePath;    
            }
    

    本当にいつもありがとうございます:bow_tone1:
    こちらはクローズとさせていただきます。

Your answer might help someone💌