Your IP : 216.73.216.79


Current Path : /var/www/html/dynaweb-cms-v1/app/Models/Traits/
Upload File :
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');
    }
}