| Current Path : /var/www/html/dynaweb-cms-v1/app/Models/Traits/ |
| Current File : /var/www/html/dynaweb-cms-v1/app/Models/Traits/Visitable.php |
<?php
namespace App\Models\Traits;
use App\Models\Backend\Visit;
use Illuminate\Database\Eloquent\Relations\MorphMany;
/**
* Trait untuk model yang menjadi VISITABLE (dilawati).
*
* Contoh: ContentArticle, ContentSlider — page/content yang dilawat orang.
* Relasi: morphMany ke Visit sebagai 'visitable'.
*/
trait Visitable
{
/**
* Senarai lawatan yang diterima oleh item ni.
*/
public function visitLogs(): MorphMany
{
return $this->morphMany(Visit::class, 'visitable');
}
/**
* Kira jumlah lawatan.
*/
public function totalViews(): int
{
return $this->visitLogs()->count();
}
/**
* Kira pelawat unik (yang ada account).
*/
public function uniqueViewers(): int
{
return $this->visitLogs()->whereNotNull('visitor_id')
->distinct('visitor_id')
->count('visitor_id');
}
/**
* Kira IP unik yang melawat.
*/
public function uniqueViewerIps(): int
{
return $this->visitLogs()->distinct('ip')->count('ip');
}
/**
* Lawatan harian untuk tempoh tertentu (default 30 hari).
* Return collection: date => total.
*/
public function dailyViews(int $days = 30)
{
return $this->visitLogs()
->selectRaw('DATE(created_at) as date, COUNT(*) as total')
->where('created_at', '>=', now()->subDays($days))
->groupBy('date')
->orderBy('date')
->pluck('total', 'date');
}
}