如何在 Laravel 5.8 中更新产品

How to update a product in Laravel 5.8

我有一个产品要编辑。请看下面的代码。

public function update(ProductRequest $request, Product $product)
{
    $product->user_id = auth()->user()->id;
    $product->title = $request->title;
    $product->body = $request->body;
    $product->price = $request->price;

    if ($request->has('image')) {
        $image = $request->file('image');
        $filename = $image->getClientOriginalName();
        $image->move(public_path('images/products'), $filename);
        $product->image = $request->file('image')->getClientOriginalName();
    }
    $product->update();
    $product->categories()->sync($request->category);

    return redirect()->route('products.index');
}

product.blade.php

<form class="form-horizontal" action="{{ route('products.update', $product->id) }}" method="post" enctype="multipart/form-data">
{{ csrf_field() }}
{{ method_field('PATCH') }}
.
.
.

除了图像,一切都变了。我试过了,但是,我没有成功。解决办法是什么?我想更新数据库中的图像。

好的,我现在去数据库,我把图像换成图片,然后我去我的项目,我再次测试了这个。

但它对我没有影响。

我改了

public function update(ProductRequest $request, Product $product)

public function update(Request $request, Product $product)

要更新模型,您应该检索它,设置您希望更新的任何属性,然后调用保存方法。请参阅 documentation 中的更新部分。

public function update(ProductRequest $request, Product $product)
{
    $product->user_id = auth()->user()->id;
    $product->title = $request->title;
    $product->body = $request->body;
    $product->price = $request->price;
    
    if ($request->has('image')) {
        $image = $request->file('image');
        $filename = $image->getClientOriginalName();
        $image->move(public_path('images/products'), $filename);
        $product->image = $request->file('image')->getClientOriginalName();
    }
    $product->save();
    $product->categories()->sync($request->category);

    return redirect()->route('products.index');
}

更新 1

假设您已经调试了上面的内容并且 $request->file('image')->getClientOriginalName() 正在返回预期值,您可能正在模型上使用字段白名单并且没有添加 image 字段加入白名单。确保 image 在模型的 $fillable 数组中。

class Product extends Model
{
    
    protected $fillable = [
        'user_id',
        'title',
        'body',
        'price',
        ...
        'image'
    ];

更新 2

如果 $request->file('image') 返回 null,则表明您的表单未提交文件。确保您的 <form> 元素在标签中包含 enctype="multipart/form-data" 属性。


更新 3

如果您已经在 <form> 元素中包含了必需的 enctype="multipart/form-data" 标签,那么我建议您执行以下操作。

dd($request->all()); 放在 update(ProductRequest $request, Product $product) 方法的顶部。 Post 表单并检查输出。

如果文件未包含在输出中,请从使用 ProductRequest $request 更改为默认的 Request $request (Illuminate\Http\Request) 然后再试一次。您的 ProductRequest class 中可能存在某些问题。


作为一个小小的批评,您可以通过以下方式改进您的代码。

・使用hasFile()代替has()

・使用$product-image = $filename代替$product->image = $request->file('image')->getClientOriginalName();

public function update(ProductRequest $request, Product $product)
{
    $product->user_id = auth()->user()->id;
    $product->title = $request->title;
    $product->body = $request->body;
    $product->price = $request->price;

    if ($request->hasFile('image')) {
        $image = $request->file('image');
        $filename = $image->getClientOriginalName();
        $image->move(public_path('images/products'), $filename);
        $product->image = $filename;
    }
    
    $product->save();
    $product->categories()->sync($request->category);

    return redirect()->route('products.index');
}

确保你有

enctype="multipart/form-data"

属性