非静态方法Illuminate \ Database \ Eloquent \ Model :: update()不应静态调用

时间:2018-12-28 04:27:53

标签: php laravel crud

我有一段这样的代码:

sys.path.append(os.path.join(os.path.dirname(__file__))) 

我遇到以下错误:

  

非静态方法Illuminate \ Database \ Eloquent \ Model :: update()应该   不能被静态调用

我有控制器:

<div class="form-group row">
    <label for="image" class="col-form-label">Изображение</label>
    <input id="image" type="file" class="form-control{{ $errors->has('image') ? ' is-invalid' : '' }}" name="image" value="{{ old('image', $products->image) }}">
    @if($products->image)
       <img src="{{ Storage::url($products->image) }}" alt="" style="width: 150px">
    @endif
    @if ($errors->has('image'))
       <span class="invalid-feedback"><strong>{{ $errors->first('image') }}</strong></span>
    @endif
</div>

这是CRUD

public function store(Request $request)
{
    $this->validate($request, [
        'name' => 'required|string|max:255',
        'image' => 'required|image|mimes:jpg,jpeg,png',
    ]);
    $file = request()->file('image') ? request()->file('image')->store('images', 'public') : null;
    $product = product::create([
        'name' => $request['name'],
        'description' => $request['description'],
        'image' => $file,
    ]);
    return redirect()->route('products.index', $product);
}

7 个答案:

答案 0 :(得分:0)

您应该尝试以下操作:

{

    $this->validate($request, [
        'name' => 'required|string|max:255',
        'image' => 'required|image|mimes:jpg,jpeg,png',
    ]);

    $file = request()->file('image') ? request()->file('image')->store('images', 'public') : null;
    $product = product::create([
        'name' => $request['name'],
        'description' => $request['description'],
        'image' => $file,
    ]);

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

答案 1 :(得分:0)

我建议您更改更新数据的方法。为了使用Laravel(实际上,不仅是Laravel,而且通常是所有编程语言和查询,例如MySQL)更新数据,您需要确定要更新的记录。在Laravel中,您可以使用find方法。当然,您可以使用其他方法,例如WHERE。因此,为了回答您的问题,您无法进行喜欢创建的更新。因此,您的update方法代码应如下所示:

public function update(Request $request, $id)
{
    $this->validate($request, [
        'key' => 'required|string|max:255',
        // 'value' => 'required',
    ]);
    $product = Product::find($id); //get the object of product you want to update
    $product->key = $request['key'];
    $product->name = $request['name'];
    //$product->value = $request['value'];
    $product->save();

    return redirect()->route('products.show', $product);
}

答案 2 :(得分:0)

更改行:

  $product = product::update([ 'key' => $request['key'], 'name' => $request['name'], // 'value' => $request['value'], ]); 

将行更改为:这里的“产品”将是表名

  DB::table('product')->update([ 'key' => $request['key'], 'name' => $request['name']]); 

答案 3 :(得分:0)

我假设您来自更新表单,请确保表单的操作是动态的

<form action="{{ route ('products') }}/{{ $product->id }}" method="post">
@csrf 
@method('PATCH')

答案 4 :(得分:0)

我建议您改变更新数据的方法。为了使用 Laravel 更新您的数据或添加有帮助的地方

转换:

product::update([ 'key' => $request['key'],'name' => $request['name']);

到:

product::where('id',$id)->update([ 'key' => $request['key'],'name' => $request['name']);

或:

product::find($id)->update([ 'key' => $request['key'],'name' => $request['name']);

答案 5 :(得分:0)

换行

$product = product::update([ 'key' => $request['key'], 'name' => $request['name'], // 'value' => $request['value'], ]); 

$product = (new product)->update([ 'key' => $request['key'], 'name' => $request['name'], // 'value' => $request['value'], ]); 
<块引用>

注意:始终建议遵循 Laravel 约定。所以 Product 而不是 product 对于模型名称会更好。但是,请使用类名的确切大小写。您的模型文件未发布,但由于您的 store 方法运行良好,我相信您使用的是 product 而不是 Product

答案 6 :(得分:0)

您可以使用如下查询构建器...

DB::table('products')->where('id', $id)->update(['value' => $request->value"]);

或者,您可以使用 Eloquent 如下...

Product::where('id', $id)->update(['value' => $request->value"]);

您的代码应如下所示...

public function update(Request $request, $id) 
{
    $this->validate($request, [ 'key' => 'required|string|max:255', // 'value' => 'required', ]); 
    $product = product::where('id', $id)->update([ 'key' => $request['key'], 'name' => $request['name'], // 'value' => $request['value'], ]); 
    return redirect()->route('products.show', $product); 
}