Apps Artificial Intelligence CSS DevOps Go JavaScript Laravel Linux MongoDB MySQL PHP Python Rust Vue

Membuat API Kategori Bersarang di Laravel 11: Panduan Praktis

1 min read .
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 😅.

Lihat Juga

chevron-up