I’m just starting to learn Laravel and while following Laracast “Laravel from scratch” series I got to the point of creating an edit page in which a have to get the id of a product and populate the inputs with existing data, but following the instructions in the video I keep getting the error
“Property [name] does not exist on this collection instance”.
ProductController.php
public function edit(Product $id) { $product = Product::find($id); return view('admin.product.edit', compact('product')); }
edit.blade.php
<div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Edit product</div> <div class="card-body"> <form action="/product" method="post"> @csrf <input type="text" name="name" id="name" placeholder="Name" value="{{$product->name}}"> <br> <textarea name="description" id="descriptopn" cols="30" rows="10" placeholder="Description">{{$product->description}}</textarea> <br> <input type="number" name="price" id="price" min="0.1" step="0.01" placeholder="Price" value="{{$product->price}}"> <br> <input type="number" name="stock" id="stock" min="1" step="1" placeholder="Stock" value="{{$product->stock}}"> <br> <button type="submit">Save</button> </form> </div> </div> </div> </div>
If it’s any help I’m currently using Laravel v8.22.1 (PHP v8.0.0), and I believe at the time of recording the series, Laracast used Laravel v6.
Edit: Adding table structure.
Migration file:
create_products_table.php
public function up() { Schema::create('products', function (Blueprint $table) { $table->id(); $table->string('name'); $table->text('description')->nullable(); $table->float('price'); $table->integer('stock'); $table->timestamps(); }); }
Edit #2: Adding Product Model
Product.php
class Product extends Model { use HasFactory; }
web.php
Route::get('/', function () { return view('welcome'); }); Auth::routes(); Route::get('/home', [AppHttpControllersHomeController::class, 'index'])->name('home'); //Admin routes Route::get('/product', [ProductController::class, 'index']); Route::post('product', [ProductController::class, 'store']); Route::get('/product/create', [ProductController::class, 'create']); //Route::get('/product/{article}', [ProductController::class, 'show']); Route::get('/product/{article}/edit', [ProductController::class, 'edit']); Route::put('/product/{product}', [ProductController::class, 'update']);
Thank you everyone for your answers I remember using this same style of logic in Laravel 6 and everything worked, but now I’ve had issues with Laravel 8, if a get rid of the error message with the suggestions of @ByWaleed and @vozaldi then the inputs in the edit.blade.php don’t get populated with the necessary data, Firefox console doesn’t show any errors and when using dd() it shows as follows
dd($id):
AppModelsProduct {#303 ▼ #connection: null #table: null #primaryKey: "id" #keyType: "int" +incrementing: true #with: [] #withCount: [] #perPage: 15 +exists: false +wasRecentlyCreated: false #attributes: [] #original: [] #changes: [] #casts: [] #classCastCache: [] #dates: [] #dateFormat: null #appends: [] #dispatchesEvents: [] #observables: [] #relations: [] #touches: [] +timestamps: true #hidden: [] #visible: [] #fillable: [] #guarded: array:1 [▼ 0 => "*" ] }
dd($product)
IlluminateDatabaseEloquentCollection {#1184 ▼ #items: [] }
Advertisement
Answer
Thank you everyone for your time
All of your answers where very helpful, but it turns out i just made a typo.
In the edit route
Route::get('/product/{article}/edit', [ProductController::class, 'edit']);
I wrote {article}
instead of {product}
(Both the model and controller where named Product) as stated by @ByWaleed. After making that correction everything works correctly.
As a recomendation for future users, if posible use Route::resource()
instead of writing each route individually it makes it less likely to make a mistake as te one i did.
Again thank you everyone.