75 lines
2.5 KiB
PHP
75 lines
2.5 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Models;
|
||
|
|
|
||
|
|
use Illuminate\Database\Eloquent\Model;
|
||
|
|
use Illuminate\Support\Str;
|
||
|
|
|
||
|
|
class Food extends Model
|
||
|
|
{
|
||
|
|
protected $table = 'foods';
|
||
|
|
|
||
|
|
// Gunakan guarded atau fillable, pastikan 'slug' dan 'category_id' diizinkan
|
||
|
|
protected $guarded = ['id'];
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Relasi ke model Category
|
||
|
|
*/
|
||
|
|
public function category()
|
||
|
|
{
|
||
|
|
return $this->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';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|