Berikut adalah tutorial langkah demi langkah untuk menambahkan fitur Wishlist. Fitur ini memungkinkan pengguna untuk menyimpan produk ke dalam wishlist dan mengaksesnya kapan saja, bahkan saat kembali ke website di lain waktu.
1. Setup Database
Tambahkan tabel wishlists
Buat tabel baru untuk menyimpan data wishlist. Jalankan perintah berikut untuk membuat migration:
php artisan make:migration create_wishlists_table
Lalu, buka file migration yang dihasilkan dan tambahkan skema berikut:
public function up()
{
Schema::create('wishlists', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('product_id');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
});
}
Jalankan migration:
php artisan migrate
2. Buat Model Wishlist
Buat model untuk wishlist dengan relasi ke pengguna dan produk:
php artisan make:model Wishlist
Isi model Wishlist seperti ini:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Wishlist extends Model
{
use HasFactory;
protected $fillable = ['user_id', 'product_id'];
public function user()
{
return $this->belongsTo(User::class);
}
public function product()
{
return $this->belongsTo(Product::class);
}
}
3. Tambahkan Relasi di Model User dan Product
Model User
Tambahkan method untuk relasi wishlist di User.php:
public function wishlist()
{
return $this->hasMany(Wishlist::class);
}
Model Product
Tambahkan method untuk relasi wishlist di Product.php:
public function wishlist()
{
return $this->hasMany(Wishlist::class);
}
4. Buat Controller Wishlist
Buat controller baru untuk mengelola wishlist:
php artisan make:controller WishlistController
Tambahkan Method di WishlistController
Add to Wishlist
Tambahkan produk ke wishlist pengguna:
public function addToWishlist(Request $request, $productId)
{
$user = auth()->user();
// Cek apakah produk sudah ada di wishlist
$existing = Wishlist::where('user_id', $user->id)->where('product_id', $productId)->first();
if ($existing) {
return redirect()->route('wishlist.view')->with('success', 'Product alrady in wishlist!');
}
Wishlist::create([
'user_id' => $user->id,
'product_id' => $productId,
]);
return redirect()->route('wishlist.view')->with('success', 'Product added to wishlist!');
}
View Wishlist
Tampilkan wishlist pengguna:
public function viewWishlist()
{
$categories = Category::all();
$wishlistItems = Wishlist::with('product')->where('user_id', auth()->id())->get();
return view('frontend.wishlist', compact('wishlistItems','categories'));
}
Remove from Wishlist
Hapus produk dari wishlist:
public function removeFromWishlist($wishlistId)
{
$wishlistItem = Wishlist::findOrFail($wishlistId);
if ($wishlistItem->user_id != auth()->id()) {
return redirect()->back()->with('error', 'You are not authorized to remove this item.');
}
$wishlistItem->delete();
return redirect()->back()->with('message', 'Product removed from wishlist!');
}
Full Controller untuk WishlistController sebagai berikut:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Wishlist;
use App\Models\Category;
class WishlistController extends Controller
{
public function addToWishlist(Request $request, $productId)
{
$user = auth()->user();
// Cek apakah produk sudah ada di wishlist
$existing = Wishlist::where('user_id', $user->id)->where('product_id', $productId)->first();
if ($existing) {
return redirect()->route('wishlist.view')->with('success', 'Product alrady in wishlist!');
}
Wishlist::create([
'user_id' => $user->id,
'product_id' => $productId,
]);
return redirect()->route('wishlist.view')->with('success', 'Product added to wishlist!');
}
public function viewWishlist()
{
$categories = Category::all();
$wishlistItems = Wishlist::with('product')->where('user_id', auth()->id())->get();
return view('frontend.wishlist', compact('wishlistItems','categories'));
}
public function removeFromWishlist($wishlistId)
{
$wishlistItem = Wishlist::findOrFail($wishlistId);
if ($wishlistItem->user_id != auth()->id()) {
return redirect()->back()->with('error', 'You are not authorized to remove this item.');
}
$wishlistItem->delete();
return redirect()->back()->with('message', 'Product removed from wishlist!');
}
}
5. Tambahkan Route
Tambahkan route baru di web.php:
Route::middleware('auth')->group(function () {
Route::post('/wishlist/add/{productId}', [WishlistController::class, 'addToWishlist'])->name('wishlist.add');
Route::get('/wishlist', [WishlistController::class, 'viewWishlist'])->name('wishlist.view');
Route::delete('/wishlist/remove/{wishlistId}', [WishlistController::class, 'removeFromWishlist'])->name('wishlist.remove');
});
6. Buat Views
View Wishlist (resources/views/frontend/wishlist/index.blade.php)
@extends('layouts.frontend')
@section('content')
<div class="container">
<h1>My Wishlist</h1>
@if (session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
@if ($wishlistItems->isEmpty())
<p>Your wishlist is empty.</p>
@else
<div class="row">
@foreach ($wishlistItems as $item)
<div class="col-md-4">
<div class="card mb-4">
<img src="{{ asset('storage/' . $item->product->image) }}" class="card-img-top" alt="{{ $item->product->name }}">
<div class="card-body">
<h5 class="card-title">{{ $item->product->name }}</h5>
<p class="card-text">${{ $item->product->price }}</p>
<form action="{{ route('wishlist.remove', $item->id) }}" method="POST">
@csrf
@method('DELETE')
<button class="btn btn-danger">Remove</button>
</form>
</div>
</div>
</div>
@endforeach
</div>
@endif
</div>
@endsection
Button Add to Wishlist di Product Page
Tambahkan tombol untuk menambahkan ke product detail agar bisa ke wishlist:
<form action="{{ route('wishlist.add', $product->id) }}" method="POST">
@csrf
<button type="submit" class="btn btn-primary">Add to Wishlist</button>
</form>
7. Testing Fitur Wishlist
- Login sebagai pengguna.
- Buka halaman produk dan klik tombol "Add to Wishlist".
- Kunjungi halaman wishlist di
/wishlistuntuk melihat semua produk di wishlist Anda. - Klik "Remove" untuk menghapus produk dari wishlist.
Jika berhasil, akan seperti berikut: