Membuat API Kategori Bersarang di Laravel 11: Panduan Praktis
Bikin API kategori bersarang itu sering banget dibutuhin buat platform e-commerce atau CMS, apalagi kalau data kategorinya harus hierarkis. Pada akhirnya, kita bakal bikin sistem yang memungkinkan kategori punya parent-child relationship, lengkap dengan API untuk membuat dan mengambil data kategori bersarang.
1. Siapkan Proyek Laravel
Bikin proyek baru dan jalankan server:
composer create-project --prefer-dist laravel/laravel laravel-nested-categories
cd laravel-nested-categories
php artisan serve
2. Buat Model & Migrasi Category
Generate model Category
beserta migrasinya:
php artisan make:model Category -m
Edit migrasi:
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->unsignedBigInteger('parent_id')->nullable();
$table->foreign('parent_id')->references('id')->on('categories')->onDelete('cascade');
$table->timestamps();
});
Migrasikan:
php artisan migrate
3. Definisikan Hubungan Parent-Child
Di app/Models/Category.php
:
class Category extends Model
{
use HasFactory;
protected $fillable = ['name', 'parent_id'];
public function parent() { return $this->belongsTo(Category::class, 'parent_id'); }
public function children() { return $this->hasMany(Category::class, 'parent_id'); }
}
4. Buat CategoryController
Generate controller:
php artisan make:controller CategoryController
Tambahkan metode untuk mengambil dan membuat kategori bersarang:
class CategoryController extends Controller
{
public function index()
{
$categories = Category::with('children')->whereNull('parent_id')->get();
return response()->json($categories);
}
public function store(Request $request)
{
$data = $request->validate([
'name' => 'required|string',
'children' => 'array',
'children.*.name' => 'required|string',
]);
$category = $this->createCategory($data);
return response()->json(['category' => $category], 201);
}
private function createCategory($data, $parentId = null)
{
$category = Category::create(['name'=>$data['name'],'parent_id'=>$parentId]);
if(!empty($data['children'])){
foreach($data['children'] as $child){
$this->createCategory($child, $category->id);
}
}
return $category->load('children');
}
}
5. Definisikan Rute API
Di routes/api.php
:
use App\Http\Controllers\CategoryController;
Route::get('/categories', [CategoryController::class, 'index']);
Route::post('/categories', [CategoryController::class, 'store']);
6. Uji API
Tambah kategori bersarang:
curl -X POST http://localhost:8000/api/categories \
-H "Content-Type: application/json" \
-d '{
"name": "Electronics",
"children": [
{ "name": "Mobile Phones", "children":[{"name":"Smartphones"},{"name":"Feature Phones"}] },
{ "name": "Laptops" }
]
}'
Ambil kategori:
curl -X GET http://localhost:8000/api/categories
Kesimpulan
Gini deh, dengan langkah-langkah ini, kamu sekarang punya API kategori bersarang yang siap dikembangkan lebih lanjut—misalnya nambah fitur update, delete, atau kueri lebih kompleks. Implementasi rekursif buat children
itu awalnya bikin saya mikir lama, tapi pas jalan, rasanya puas banget 😅.