Module 5 – User Side (Pizza ඇණවුම් කිරීම)

මේ කොටසේදී අපි අපේ project එකේ වැදගත්ම մասයක් නිර්මාණය කරනවා: පරිශීලකයින්ට pizza බලා, තෝරාගෙන ඇණවුම් කිරීමට හැකි පිටු සකස් කිරීම. අපි Routes, Controllers සහ Views එකට භාවිතා කරමු.


පියවර 1: Pizza Data Database එකට ඇතුළත් කිරීම (Seeder) 🍕

Pizza පෙන්වන්න කලින්, අපේ `pizzas` table එකේ data ටිකක් තියෙන්න ඕන. මේ සඳහා අපි **Seeder** එකක් පාවිච්චි කරමු. Seeder එකකින් අපිට demo data database එකට පහසුවෙන් ඇතුළත් කරන්න පුළුවන්.

මුලින්ම Seeder file එක හදාගන්න මේ command එක run කරන්න.

php artisan make:seeder PizzaSeeder

දැන් `database/seeders/PizzaSeeder.php` file එක open කර `run()` function එකට මේ code එක ඇතුළත් කරන්න.

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

public function run()
{
    DB::table('pizzas')->insert([
        ['name' => 'Pizza Margherita', 'price' => 1800.00],
        ['name' => 'Pizza Pepperoni', 'price' => 2200.00],
    ]);
}

දැන් `database/seeders/DatabaseSeeder.php` file එකේ `run()` function එකේ මේ seeder එක call කරන්න.

public function run()
{
    $this->call([
        PizzaSeeder::class,
    ]);
}

අවසානයේ, seeder එක run කිරීමට මේ command එක දෙන්න.

php artisan db:seed

දැන් phpMyAdmin එකේ `pizzas` table එක බැලුවොත්, pizza වර්ග දෙක ඇතුළත් වී ඇති බව පෙනේවි.


පියවර 2: Controller සහ Routes සෑදීම ⚙️

Orders සම්බන්ධ සියලුම logic ටික තියාගන්න අපි අලුත් Controller එකක් හදමු.

php artisan make:controller OrderController

දැන් `routes/web.php` file එකට ගිහින්, logged in user කෙනෙකුට පමණක් පිවිසිය හැකි routes ටිකක් හදමු.

use App\Http\Controllers\OrderController;

// ... other routes

Route::middleware(['auth'])->group(function () {
    // Route to show the order form
    Route::get('/order', [OrderController::class, 'create'])->name('order.create');

    // Route to store the new order
    Route::post('/order', [OrderController::class, 'store'])->name('order.store');

    // Route to show user's own orders
    Route::get('/my-orders', [OrderController::class, 'index'])->name('order.index');
});

පියවර 3: Pizza පෙන්වා Order Form එක සෑදීම (View) 🧾

දැන් අපි `OrderController.php` එකට ගිහින් pizza list එක view එකට pass කරන logic එක ලියමු.

use App\Models\Pizza; // Import the Pizza model

public function create()
{
    $pizzas = Pizza::all();
    return view('order.create', compact('pizzas'));
}

දැන් `resources/views/` තුළ `order` නමින් folder එකක් සාදා, ඒ තුළ `create.blade.php` නමින් file එකක් සාදන්න. එයට පහත code එක ඇතුළත් කරන්න.

<!-- This would be inside your main app layout -->
<h2>Place a New Order</h2>

<form action="{{ route('order.store') }}" method="POST">
    @csrf
    <div class="mb-3">
        <label for="pizza_id" class="form-label">Choose Pizza</label>
        <select name="pizza_id" id="pizza_id" class="form-control">
            @foreach ($pizzas as $pizza)
                <option value="{{ $pizza->id }}">
                    {{ $pizza->name }} - (Rs. {{ $pizza->price }})
                </option>
            @endforeach
        </select>
    </div>
    <div class="mb-3">
        <label for="quantity" class="form-label">Quantity</label>
        <input type="number" name="quantity" id="quantity" class="form-control" min="1" value="1">
    </div>
    <button type="submit" class="btn btn-primary">Place Order</button>
</form>

පියවර 4: Order එක Database එකේ Save කිරීම 💾

`OrderController.php` එකේ `store` function එකට ගොස් form එකෙන් එන data save කරන logic එක ලියමු.

use App\Models\Order;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

public function store(Request $request)
{
    $request->validate([
        'pizza_id' => 'required|exists:pizzas,id',
        'quantity' => 'required|integer|min:1',
    ]);

    Order::create([
        'user_id' => Auth::id(),
        'pizza_id' => $request->pizza_id,
        'quantity' => $request->quantity,
        // Status will be 'Pending' by default from the migration
    ]);

    return redirect()->route('order.index')->with('success', 'Order placed successfully!');
}

පියවර 5: User ගේ Orders පෙන්වීම (Dashboard) Dashboard 📊

අවසාන වශයෙන්, user ට තමන්ගේ orders ටික බලාගන්න dashboard එක හදමු. `OrderController.php` එකේ `index` function එක සකසන්න.

public function index()
{
    $orders = Order::where('user_id', Auth::id())->with('pizza')->latest()->get();
    return view('order.index', compact('orders'));
}

මේ සඳහා `Order` සහ `Pizza` models අතර සම්බන්ධයක් (`relationship`) අවශ්‍යයි. `app/Models/Order.php` file එකට ගොස් මේ function එක ඇතුළත් කරන්න.

public function pizza()
{
    return $this->belongsTo(Pizza::class);
}

දැන් `resources/views/order/` තුළ `index.blade.php` file එක හදා, පහත කේතය යොදන්න.

<h2>My Orders</h2>

@if(session('success'))
    <div class="alert alert-success">{{ session('success') }}</div>
@endif

<table class="table">
    <thead>
        <tr>
            <th>Pizza</th>
            <th>Quantity</th>
            <th>Status</th>
            <th>Ordered At</th>
        </tr>
    </thead>
    <tbody>
        @forelse ($orders as $order)
            <tr>
                <td>{{ $order->pizza->name }}</td>
                <td>{{ $order->quantity }}</td>
                <td>{{ $order->status }}</td>
                <td>{{ $order->created_at->format('Y-m-d H:i') }}</td>
            </tr>
        @empty
            <tr>
                <td colspan="4" class="text-center">You have no orders yet.</td>
            </tr>
        @endforelse
    </tbody>
</table>

දැන් `/order` සහ `/my-orders` URL වලට ගොස් බලන්න! ඔබට pizza තෝරා order කර, ඒවායේ විස්තර බැලිය හැකි වේවි.


සුභ පැතුම්! ඔබ අපේ application එකේ user සඳහා වන ප්‍රධානම කොටස සාර්ථකව නිම කළා. ඊළඟට අපි Admin ට මේ orders කළමනාකරණය කිරීමට Admin Panel එක හදමු.

« පෙර පාඩම: Database & Models ඊළඟ පාඩම: Admin Side »