belongsTo(Category::class, 'category_id'); } protected static function booted() { parent::booted(); static::saving(function ($supply) { // 1. Sinkronisasi Slug (Mencegah error SQL sebelumnya) if ($supply->isDirty('nama_perlengkapan') || empty($supply->slug)) { $supply->slug = Str::slug($supply->nama_perlengkapan) . '-' . Str::random(5); } // 2. Auto-Categorization if (empty($supply->category_id)) { $name = strtolower($supply->nama_perlengkapan); // Ambil kategori yang punya keywords $categories = Category::whereNotNull('keywords')->get(); foreach ($categories as $cat) { $keywords = explode(',', strtolower($cat->keywords)); foreach ($keywords as $keyword) { $trimmed = trim($keyword); // Cek apakah "pasir" atau keyword lain ada di nama produk if (!empty($trimmed) && str_contains($name, $trimmed)) { $supply->category_id = $cat->id; // PENTING: Update kolom teks 'kategori' agar tampilan tidak 'Umum' $supply->kategori = $cat->name; return; } } } // 3. Fallback jika tidak ada yang cocok // Cari kategori yang mengandung kata 'Pasir' atau 'Umum' $default = Category::where('name', 'LIKE', '%Pasir%') ->orWhere('name', 'Umum') ->first(); if ($default) { $supply->category_id = $default->id; $supply->kategori = $default->name; } else { $supply->kategori = 'Umum'; } } }); } }