Jun ADM
Jun ADM

Reputation: 63

Non-static method Illuminate\Database\Eloquent\Model::update() should not be called statically

I have a piece of code like this:

<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>

I got the following error:

Non-static method Illuminate\Database\Eloquent\Model::update() should not be called statically

and I have Controller:

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);
}

It's CRUD

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

Upvotes: 1

Views: 29750

Answers (7)

Chetam Okafor
Chetam Okafor

Reputation: 573

You can use query builder as below...

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

OR, you may use Eloquent as below...

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

Your code should look like below...

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); 
}

Upvotes: 3

Kareem Adesola
Kareem Adesola

Reputation: 31

Change line

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

To

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

Note: It is always advisable to follow the Laravel convention. So Product instead of product would be better for the model name. However, use the exact case of the class name. Your model file wasn't posted but since your store method worked fine, I believe you used product instead of Product

Upvotes: 3

Mohammed Abdul Nasser
Mohammed Abdul Nasser

Reputation: 11

I suggest you to change your approach to update data. In order to update your data with Laravel or add where it will be help

convert this:

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

to:

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

or:

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

Upvotes: 1

ElIrla
ElIrla

Reputation: 1

I asume you come from an update form, make sure your form's action is dynamic

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

Upvotes: 0

Simoni Shah
Simoni Shah

Reputation: 11

Change Line:

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

Change Line To: here 'product' will be table name

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

Upvotes: 1

YANZ
YANZ

Reputation: 386

I suggest you to change your approach to update data. In order to update your data with Laravel (in fact, not only Laravel but in generally all programming languages and query such as MySQL), you need to determine what record you want to update. In Laravel you can do that with find method. Sure, you can use another method like WHERE. So, for answer your problem, you can't do an update like to create. Therefore, your update method code should look like this:

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);
}

Upvotes: 0

user10186369
user10186369

Reputation:

You should try this:

{

    $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');
}

Upvotes: 0

Related Questions