File: //home/armgroup/libs/app/Models/Menu.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Spatie\Activitylog\LogOptions;
use Spatie\Activitylog\Traits\LogsActivity;
class Menu extends Model
{
use HasFactory, LogsActivity;
protected $guarded = ['id'];
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults()
->logUnguarded()
->setDescriptionForEvent(fn (string $eventName) => "منوها ({$this->title}) ".eventNameTranslate($eventName));
}
protected static function boot()
{
parent::boot();
static::addGlobalScope('order', function (Builder $builder) {
$builder->orderByRaw('ISNULL(sort_order), sort_order ASC');
});
}
protected static function booted()
{
static::updated(function ($menu) {
Cache::forget('menus');
});
static::created(function ($menu) {
Cache::forget('menus');
});
static::deleted(function ($menu) {
Cache::forget('menus');
});
}
public function children()
{
return $this->hasMany(Menu::class, 'parent_id');
}
public function activeChildren()
{
return $this->children()
->where('status', true);
}
public function parent()
{
return $this->belongsTo(Menu::class, 'parent_id');
}
public static function getMenus()
{
return static::query()
->whereNull('parent_id')
->where('status', true)
->with('activeChildren')
->get();
}
}