belongsTo(Category::class, 'category_id'); } /** * Booting model events */ protected static function booted() { static::saving(function ($food) { // 1. OTOMATIS GENERATE SLUG // Hanya generate jika nama berubah atau slug masih kosong if ($food->isDirty('nama_makanan') || empty($food->slug)) { $food->slug = Str::slug($food->nama_makanan) . '-' . Str::random(5); } // 2. AUTO-CATEGORIZATION (SMART LOGIC) // Hanya jalankan jika category_id belum diisi manual if (empty($food->category_id)) { $productName = strtolower($food->nama_makanan); $categories = Category::whereNotNull('keywords')->get(); $found = false; foreach ($categories as $cat) { $keywordsArray = explode(',', strtolower($cat->keywords)); foreach ($keywordsArray as $keyword) { $cleanKeyword = trim($keyword); if (!empty($cleanKeyword) && str_contains($productName, $cleanKeyword)) { $food->category_id = $cat->id; $food->kategori = $cat->name; $found = true; break; // Keluar dari loop keyword } } if ($found) break; // Keluar dari loop kategori } // 3. FALLBACK LOGIC // Jika tidak ada keyword yang cocok, cari kategori default if (!$found) { $default = Category::where('name', 'Dry Food') ->orWhere('name', 'Umum') ->first(); if ($default) { $food->category_id = $default->id; $food->kategori = $default->name; } else { $food->kategori = 'Umum'; } } } }); } }