Farirai's avatar

Missing required parameter for [Route: sales.update] [URI: sales/{sale}] [Missing parameter: sale].

help me fix my code getting error Missing required parameter for [Route: sales.update] [URI: sales/{sale}] [Missing parameter: sale]. my sales controller ``` <?php

namespace App\Http\Controllers;

use App\Http\Requests\SalesStoreRequest; use App\Models\Sales; use Illuminate\Http\Request;

class SalesController extends Controller { /** * Display a listing of the resource. */ public function index() { $sales = Sales::all(); return view('sales.index', compact('sales')); }

/**
 * Show the form for creating a new resource.
 */
public function create()
{
    return view('sales.create');
}

/**
 * Store a newly created resource in storage.
 */
public function store(SalesStoreRequest $request)
{
    $request->validate([
        'name' => 'required',
        'price' => 'required',
        'client_name' => 'required',
        'client_mobile' => 'required',
    ]);
    Sales::Create([
        'name' => $request->name,
        'price' => $request->price,
        'client_name' => $request->client_name,
        'client_mobile' => $request->client_mobile,
    ]);
    return redirect()
        ->route('sales.index')
        ->with('success', 'Sale created successfully');
}

/**
 * Display the specified resource.
 */
public function show(Sales $sales)
{
    //
}

/**
 * Show the form for editing the specified resource.
 */
public function edit(Sales $sales)
{
    return view('sales.edit', compact('sales'));
}

/**
 * Update the specified resource in storage.
 */
public function update(SalesStoreRequest $request, Sales $sales)
{
    $request->validate([
        'name' => 'required',
        'price' => 'required',
        'client_name' => 'required',
        'client_mobile' => 'required',
    ]);
    $sales->update($request->all());

    return redirect()
        ->route('sales.index')
        ->with('success', 'Sale updated successfully');
}

/**
 * Remove the specified resource from storage.
 */
public function destroy(Sales $sales)
{
    $sales->delete();
    return redirect()
        ->route('sales.index')
        ->with('success', 'Sale deleted successfully');
}

} my index.blade.php @include('layouts.app')

<a href="/"> <button type="submit" class="w-28 h-8 bg-gray-600 text-white mt-8 rounded-sm">
        Home
    </button></a>
<h1 class="font-sans text-3xl text-gray-800 mt-10">All Sales</h1>
<div class="relative overflow-x-auto border-black border-2 mt-5">
    <table class="w-full text-sm text-left text-gray-500">
        <thead class="text-xs text-gray-700 uppercase bg-gray-50">
            <tr>
                <th scope="col" class="px-6 py-3">
                    Name
                </th>
                <th scope="col" class="px-6 py-3">
                    Price
                </th>
                <th scope="col" class="px-6 py-3">
                    Client Name
                </th>
                <th scope="col" class="px-6 py-3">
                    Client Mobile
                </th>
                <th scope="col" class="px-6 py-3">
                    Action
                </th>
            </tr>
        </thead>
        <tbody>
            @foreach ($sales as $sale)
                <tr class="bg-white border-b">
                    <th scope="row" class="px-6 py-4">
                        {{ $sale->name }}
                    </th>
                    <td class="px-6 py-4">
                        {{ $sale->price }}
                    </td>
                    <td class="px-6 py-4">
                        {{ $sale->client_name }}
                    </td>
                    <td class="px-6 py-4">
                        {{ $sale->client_mobile }}
                    </td>
                    <td class="px-6 py-4">
                        <div class="flex space-x-2">
                            <a href="{{ route('sales.edit', $sale->id) }}">
                                <button type="submit" class="w-28 h-8 bg-gray-600 text-white mt-8 rounded-sm">
                                    Edit
                                </button></a>
                            <form class="" method="POST" action="{{ route('sales.destroy', $sale->id) }}"
                                onsubmit="return confirm('Are you sure ?');">
                                @csrf
                                @method('DELETE')
                                <button type="submit" class="w-28 h-8 bg-gray-600 text-white mt-8 rounded-sm">
                                    Delete
                                </button>
                            </form>
                        </div>
                    </td>
                </tr>
            @endforeach
        </tbody>
    </table>
</div>

<a href="{{ route('sales.create') }}"> <button type="submit"
        class="w-28 h-8 bg-gray-600 text-white mt-8 rounded-sm">
        Create
    </button></a>
``` my update.blade.php ``` @include('layouts.app')
<a href="/"> <button type="submit" class="w-28 h-8 bg-gray-600 text-white mt-8 rounded-sm">
        Home
    </button></a>
<h1 class="font-sans text-3xl text-gray-800 mt-10">All Sales</h1>
<div class="relative overflow-x-auto border-black border-2 mt-5">
    <table class="w-full text-sm text-left text-gray-500">
        <thead class="text-xs text-gray-700 uppercase bg-gray-50">
            <tr>
                <th scope="col" class="px-6 py-3">
                    Name
                </th>
                <th scope="col" class="px-6 py-3">
                    Price
                </th>
                <th scope="col" class="px-6 py-3">
                    Client Name
                </th>
                <th scope="col" class="px-6 py-3">
                    Client Mobile
                </th>
                <th scope="col" class="px-6 py-3">
                    Action
                </th>
            </tr>
        </thead>
        <tbody>
            @foreach ($sales as $sale)
                <tr class="bg-white border-b">
                    <th scope="row" class="px-6 py-4">
                        {{ $sale->name }}
                    </th>
                    <td class="px-6 py-4">
                        {{ $sale->price }}
                    </td>
                    <td class="px-6 py-4">
                        {{ $sale->client_name }}
                    </td>
                    <td class="px-6 py-4">
                        {{ $sale->client_mobile }}
                    </td>
                    <td class="px-6 py-4">
                        <div class="flex space-x-2">
                            <a href="{{ route('sales.edit', $sale->id) }}">
                                <button type="submit" class="w-28 h-8 bg-gray-600 text-white mt-8 rounded-sm">
                                    Edit
                                </button></a>
                            <form class="" method="POST" action="{{ route('sales.destroy', $sale->id) }}"
                                onsubmit="return confirm('Are you sure ?');">
                                @csrf
                                @method('DELETE')
                                <button type="submit" class="w-28 h-8 bg-gray-600 text-white mt-8 rounded-sm">
                                    Delete
                                </button>
                            </form>
                        </div>
                    </td>
                </tr>
            @endforeach
        </tbody>
    </table>
</div>

<a href="{{ route('sales.create') }}"> <button type="submit"
        class="w-28 h-8 bg-gray-600 text-white mt-8 rounded-sm">
        Create
    </button></a>
``` my route ```
0 likes
7 replies
tykus's avatar

You are not showing any code that uses the sales.update named Route. Wherever you are using this named Route, you need to ensure you are passing the ID, e.g.

route('sales.update', $sale->id)

And the $sale must have an ID (i.e. it exists in the database)

Farirai's avatar

@tykus sorry im confused but i passed the routehere <a href="{{ route('sales.edit', $sale->id) }}">

tykus's avatar

@Farirai okay? But the error message specifically mentions Missing required parameter for [Route: sales.update] - so you must be using this named Route somewhere.

Farirai's avatar

@tykus my browser url http://localhost:8000/sales/1/edit my edit.blade.php ``` @method('put') @csrf Name @error('name') {{ $message }} @enderror

        <div class="form-group row">
            <label for="price" class="col-md-4 col-form-label text-md-right">Price</label>
            <div class="col-md-6">
                <input id="price" type="text" value="{{ $sales->price }}"
                    class="border-2 form-control @error('price') is-invalid @enderror" name="price">
                @error('price')
                    <span class="invalid-feedback" role="alert">
                        <strong>{{ $message }}</strong>
                    </span>
                @enderror
            </div>
        </div>

        <div class="form-group row">
            <label for="client_name" class="col-md-4 col-form-label text-md-right">Client Name</label>
            <div class="col-md-6">
                <input id="client_name" type="text" value="{{ $sales->client_name }}"
                    class="border-2 form-control @error('client_name') is-invalid @enderror" name="client_name">
                @error('client_name')
                    <span class="invalid-feedback" role="alert">
                        <strong>{{ $message }}</strong>
                    </span>
                @enderror
            </div>
        </div>

        <div class="form-group row">
            <label for="client_mobile" class="col-md-4 col-form-label text-md-right">Client Mobile</label>
            <div class="col-md-6">
                <input id="client_mobile" type="text" value="{{ $sales->client_mobile }}"
                    class="border-2 form-control @error('client_mobile') is-invalid @enderror" name="client_mobile">
                @error('client_mobile')
                    <span class="invalid-feedback" role="alert">
                        <strong>{{ $message }}</strong>
                    </span>
                @enderror
            </div>
        </div>
        <button type="submit" class="w-28 h-8 bg-gray-600 text-white mt-8 rounded-sm">
            Create
        </button>
    </div>
</form> ```
tykus's avatar

@Farirai by convention, we make a PUT Request to the update Controller action, so the Blade template should look like:

<form method="POST" action="{{ route('sales.update', $sales->id) }}">
    @csrf
    @method('PUT')

The form action URL in the browser source will look like: http://localhost:8000/sales/1

tykus's avatar

@Farirai that tells me that $sales->id is probably null. Most likely, you are not getting the Sales instance correctly. If we look at the edit action, you are expecting a $sales parameter for Route Model binding; but probably the Route registers a {sale} wildcard. For Route Model binding to work, you must match the wildcard with the parameter:

public function edit(Sales $sale)
{
    return view('sales.edit', compact('sale'));
}

You will need to also update the template:

<form method="POST" action="{{ route('sales.update', $sales->id) }}">
    @csrf
    @method('PUT')
    <!-- etc. -->
    <div class="form-group row">
            <label for="price" class="col-md-4 col-form-label text-md-right">Price</label>
            <div class="col-md-6">
                <input id="price" type="text" value="{{ $sale->price }}"
                    class="border-2 form-control @error('price') is-invalid @enderror" name="price">
                @error('price')
                    <span class="invalid-feedback" role="alert">
                        <strong>{{ $message }}</strong>
                    </span>
                @enderror
            </div>
        </div>


Please or to participate in this conversation.