如何在Laravel 5.8中更新产品

时间:2019-05-16 04:55:27

标签: laravel 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)

2 个答案:

答案 0 :(得分:1)

要更新模型,应检索它,设置要更新的所有属性,然后调用save方法。请参阅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 字段添加到白名单中。确保图像在模型的$fillable数组中。

class Product extends Model
{

    protected $fillable = [
        'user_id',
        'title',
        'body',
        'price',
        ...
        'image'
    ];

更新2

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


更新3

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

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

如果文件未包含在输出中,请从使用 ProductRequest $ request 更改为默认的 Request $ request Illuminate\Http\Request),然后重试。您的ProductRequest类中可能有引起问题的东西。


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

・使用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');
}

答案 1 :(得分:0)

确保您拥有

enctype="multipart/form-data"

财产