Berikut adalah tutorial langkah demi langkah untuk membuat halaman pengguna yang dapat melihat daftar pesanan mereka dan memeriksa status pesanan:

Sebelum ke langkah berikutnya. Silahkan ikuti tutorial sebelumnya tentang Manajemen order di administrator

Langkah 1: Tambahkan Route untuk Halaman Order

Buka file routes/web.php dan tambahkan route untuk halaman daftar pesanan pengguna.

use App\Http\Controllers\UserOrderController;

Route::middleware(['auth'])->group(function () {
    Route::get('/orders', [UserOrderController::class, 'index'])->name('user.orders');
    Route::get('/orders/{order}', [UserOrderController::class, 'show'])->name('user.orders.show');
});

Langkah 2: Buat Controller untuk Mengelola Order

Jalankan perintah berikut untuk membuat controller:

php artisan make:controller UserOrderController

UserOrderController.php

Tambahkan method untuk menampilkan daftar pesanan dan detail pesanan.

namespace App\Http\Controllers;

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

class UserOrderController extends Controller
{
    /**
     * Menampilkan daftar pesanan pengguna.
     */
    public function index()
    {
        $categories = Category::all();
        $orders = Order::where('user_id', Auth::id())->latest()->get();
        return view('frontend.orders.index', compact('orders','categories'));
    }

    /**
     * Menampilkan detail pesanan.
     */
    public function show(Order $order)
    {
        $categories = Category::all();

        if ($order->user_id !== Auth::id()) {
            abort(403, 'Unauthorized action.');
        }

        return view('frontend.orders.show', compact('order','categories'));
    }
}

Langkah 3: Buat View untuk Menampilkan Order

Buat File View frontend/orders/index.blade.php

File ini akan menampilkan daftar pesanan pengguna.

@extends('layouts.frontend')

@section('content')
<div class="container my-4">
    <h1 class="mb-4">Your Orders</h1>
    <div class="table-responsive">
        <table class="table table-striped">
            <thead>
                <tr>
                    <th>#</th>
                    <th>Order ID</th>
                    <th>Status</th>
                    <th>Total</th>
                    <th>Created At</th>
                    <th>Actions</th>
                </tr>
            </thead>
            <tbody>
                @forelse ($orders as $order)
                    <tr>
                        <td>{{ $loop->iteration }}</td>
                        <td>{{ $order->id }}</td>
                        <td>{{ ucfirst($order->status) }}</td>
                        <td>${{ number_format($order->total, 2) }}</td>
                        <td>{{ $order->created_at->format('d M Y, H:i') }}</td>
                        <td>
                            <a href="{{ route('user.orders.show', $order->id) }}" class="btn btn-primary btn-sm">View</a>
                        </td>
                    </tr>
                @empty
                    <tr>
                        <td colspan="6" class="text-center">No orders found</td>
                    </tr>
                @endforelse
            </tbody>
        </table>
    </div>
</div>
@endsection

Buat File View frontend/orders/show.blade.php

File ini akan menampilkan detail pesanan.

@extends('layouts.frontend')

@section('content')
<div class="container my-4">
    <h1>Order Details</h1>
    <div class="card">
        <div class="card-header">
            <strong>Order ID:</strong> {{ $order->id }}
        </div>
        <div class="card-body">
            <p><strong>Status:</strong> {{ ucfirst($order->status) }}</p>
            <p><strong>Total:</strong> ${{ number_format($order->total, 2) }}</p>
            <p><strong>Order Date:</strong> {{ $order->created_at->format('d M Y, H:i') }}</p>
            <h5>Items:</h5>
            <ul>
                @foreach ($order->items as $item)
                    <li>{{ $item->product->name }} (x{{ $item->quantity }}) - ${{ number_format($item->price, 2) }}</li>
                @endforeach
            </ul>
        </div>
    </div>
</div>
@endsection

Langkah 4: Update Model Order

Tambahkan relasi di model Order untuk menghubungkan detail pesanan dan produk.

Order.php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Order extends Model
{
    use HasFactory;

    protected $fillable = ['user_id', 'status', 'total'];

    public function items()
    {
        return $this->hasMany(OrderDetail::class);
    }
}

OrderDetail.php

Tambahkan relasi ke produk.

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class OrderDetail extends Model
{
    use HasFactory;

    protected $fillable = ['order_id', 'product_id', 'quantity', 'price'];

    public function product()
    {
        return $this->belongsTo(Product::class);
    }
}

Langkah 5: Update Layout Frontend

Tambahkan link ke halaman orders di menu navigasi pengguna yang sudah login.

<li><a href="{{ route('user.orders') }}">My Orders</a></li>

Langkah 6: Testing

Login sebagai user dan tambahkan beberapa pesanan.

Akses halaman /orders untuk melihat daftar pesanan.

orders users

Klik tombol "View" untuk melihat detail pesanan.

orders detail