Reputation: 63
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
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
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 usedproduct
instead ofProduct
Upvotes: 3
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
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
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
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
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