Untuk membuat tutorial CRUD berbasis e-commerce, berikut adalah struktur database dan backend yang bisa digunakan sebagai dasar. Ini mencakup entitas utama seperti pengguna, produk, kategori, dan pesanan. Backend menggunakan Laravel dan mengimplementasikan operasi CRUD di dalam controller dan model.
Struktur Database
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
role ENUM('admin', 'customer') DEFAULT 'customer',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
price DECIMAL(10, 2) NOT NULL,
stock INT NOT NULL,
category_id INT,
image_url VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES categories(id)
);
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
total_amount DECIMAL(10, 2) NOT NULL,
status ENUM('pending', 'completed', 'cancelled') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE order_items (
id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT,
product_id INT,
quantity INT NOT NULL,
price DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(id),
FOREIGN KEY (product_id) REFERENCES products(id)
);
1. UserController (untuk login, register, profile)
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class UserController extends Controller
{
public function register(Request $request) {
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8',
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
return response()->json($user, 201);
}
public function login(Request $request) {
$request->validate([
'email' => 'required|string|email',
'password' => 'required|string',
]);
if (Auth::attempt($request->only('email', 'password'))) {
return response()->json(Auth::user(), 200);
}
return response()->json(['message' => 'Unauthorized'], 401);
}
public function profile() {
return response()->json(Auth::user(), 200);
}
}
2. ProductController (untuk CRUD produk)
namespace App\Http\Controllers;
use App\Models\Product;
use Illuminate\Http\Request;
class ProductController extends Controller
{
public function index() {
return response()->json(Product::all(), 200);
}
public function store(Request $request) {
$request->validate([
'name' => 'required|string|max:255',
'price' => 'required|numeric',
'stock' => 'required|integer',
'category_id' => 'required|exists:categories,id',
]);
$product = Product::create($request->all());
return response()->json($product, 201);
}
public function show($id) {
return response()->json(Product::find($id), 200);
}
public function update(Request $request, $id) {
$request->validate([
'name' => 'sometimes|string|max:255',
'price' => 'sometimes|numeric',
'stock' => 'sometimes|integer',
'category_id' => 'sometimes|exists:categories,id',
]);
$product = Product::findOrFail($id);
$product->update($request->all());
return response()->json($product, 200);
}
public function destroy($id) {
$product = Product::findOrFail($id);
$product->delete();
return response()->json(['message' => 'Product deleted'], 200);
}
}
3. OrderController (untuk membuat pesanan dan item pesanan)
namespace App\Http\Controllers;
use App\Models\Order;
use App\Models\OrderItem;
use App\Models\Product;
use Illuminate\Http\Request;
class OrderController extends Controller
{
public function store(Request $request) {
$request->validate([
'products' => 'required|array',
]);
$order = Order::create([
'user_id' => Auth::id(),
'total_amount' => 0, // to be calculated
]);
$totalAmount = 0;
foreach ($request->products as $productData) {
$product = Product::findOrFail($productData['id']);
$itemTotal = $product->price * $productData['quantity'];
$totalAmount += $itemTotal;
OrderItem::create([
'order_id' => $order->id,
'product_id' => $product->id,
'quantity' => $productData['quantity'],
'price' => $product->price,
]);
}
$order->total_amount = $totalAmount;
$order->save();
return response()->json($order, 201);
}
public function updateStatus($orderId, Request $request) {
$order = Order::findOrFail($orderId);
$order->status = $request->status;
$order->save();
return response()->json($order, 200);
}
}