Langkah selanjutnya, kita akan  menampilkan data order dan detailnya serta memberikan opsi bagi admin untuk mengubah status order, kita akan membangun fitur manajemen order di halaman administrator. Fitur ini mencakup pembuatan CRUD untuk order dan order detail serta opsi untuk memperbarui status order. Kita sebelumnya sudah membuat tabel untuk orders dan orderitems. Kita akan menggunakan tabel tersebut. 

Langkah 1: Buat Controller untuk Order Management

Buat controller OrderController untuk mengelola data order:

php artisan make:controller OrderController

Di OrderController.php, buat method untuk menampilkan list order, detail order, dan mengubah status order:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\Order;
use Illuminate\Http\Request;

class OrderController extends Controller
{
    // Tampilkan daftar order
    public function index()
    {
        $orders = Order::with('user')->get();
        return view('admin.orders.index', compact('orders'));
    }

    // Tampilkan detail order tertentu
    public function show($id)
    {
        $order = Order::with('items.product')->findOrFail($id);
        return view('admin.orders.show', compact('order'));
    }

    // Update status order
    public function updateStatus(Request $request, $id)
    {
        $order = Order::findOrFail($id);
        $order->status = $request->status;
        $order->save();

        return redirect()->route('orders.index')->with('success', 'Order status updated successfully');
    }
}

Langkah 2: Buat Views untuk Manajemen Order

Buat File index.blade.php untuk Menampilkan Daftar Order

Buat file di resources/views/admin/orders/index.blade.php:

@extends('layouts.admin')

@section('content')
<div class="container">
    <h2>Order List</h2>
    <table class="table">
        <thead>
            <tr>
                <th>Order ID</th>
                <th>User</th>
                <th>Total Price</th>
                <th>Status</th>
                <th>Actions</th>
            </tr>
        </thead>
        <tbody>
            @foreach($orders as $order)
            <tr>
                <td>{{ $order->id }}</td>
                <td>{{ $order->user->name }}</td>
                <td>{{ $order->total}}</td>
                <td>{{ $order->status }}</td>
                <td>
                    <a href="{{ route('admin.orders.show', $order->id) }}" class="btn btn-primary">View</a>
                </td>
            </tr>
            @endforeach
        </tbody>
    </table>
</div>
@endsection

Buat File show.blade.php untuk Menampilkan Detail Order

Buat file di resources/views/admin/orders/show.blade.php:

@extends('layouts.admin')

@section('content')
<div class="container">
    <h2>Order Details - Order #{{ $order->id }}</h2>
    <p><strong>User:</strong> {{ $order->user->name }}</p>
    <p><strong>Total Price:</strong> ${{ $order->total}}</p>

    <!-- Tampilkan detail order -->
    <h3>Order Items</h3>
    <table class="table">
        <thead>
            <tr>
                <th>Product</th>
                <th>Quantity</th>
                <th>Price</th>
            </tr>
        </thead>
        <tbody>
            @foreach($order->items as $item)
            <tr>
                <td>{{ $item->product->name }}</td>
                <td>{{ $item->quantity }}</td>
                <td>${{ $item->price }}</td>
            </tr>
            @endforeach
        </tbody>
    </table>

    <!-- Form untuk update status order -->
    <form action="{{ route('admin.orders.updateStatus', $order->id) }}" method="POST">
        @csrf
        @method('PUT')
        <div class="form-group">
            <label for="status">Order Status</label>
            <select name="status" id="status" class="form-control">
                <option value="Pending" {{ $order->status == 'Pending' ? 'selected' : '' }}>Pending</option>
                <option value="Processing" {{ $order->status == 'Processing' ? 'selected' : '' }}>Processing</option>
                <option value="Completed" {{ $order->status == 'Completed' ? 'selected' : '' }}>Completed</option>
                <option value="Canceled" {{ $order->status == 'Canceled' ? 'selected' : '' }}>Canceled</option>
            </select>
        </div>
        <button type="submit" class="btn btn-success">Update Status</button>
    </form>
</div>
@endsection

Langkah 3: Tambahkan Routes untuk Manajemen Order

Di file routes/web.php, tambahkan route untuk order management di dalam grup admin:

use App\Http\Controllers\OrderController;

Route::prefix('admin')->middleware('auth')->group(function () {
    Route::get('/orders', [OrderController::class, 'index'])->name('orders.index');
    Route::get('/orders/{id}', [OrderController::class, 'show'])->name('admin.orders.show');
    Route::put('/orders/{id}/status', [OrderController::class, 'updateStatus'])->name('admin.orders.updateStatus');
});

Langkah 4: Tambahkan menu order di admin

Buka file admin.blade.php di folder layouts dan tambahkan menu order berikut:

<a class="nav-link {{ request()->is('orders*') ? 'active' : '' }}" href="{{ route('orders.index') }}">
    <i class="fa fa-shopping-cart"></i> Orders
</a>

Langkah 5. Edit model Order

Edit model order.php untuk menambahkan function user, agar relation antara user dan order berhasil kita panggil:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Order extends Model
{
    protected $fillable = [
        'user_id', 'total', 'status','payment_status'
    ];

    // Relasi ke user
    public function user()
    {
        return $this->belongsTo(User::class);
    }

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

Langkah 6: Testing

Buka halaman daftar order di /admin/orders untuk melihat semua order.
Order List

Order detail