Muhammad Amirul Ihsan
Muhammad Amirul Ihsan Fullstack Developer, Content Creator, suka berbagi pengalaman / pengetahuan lewat tulisan maupun video di kawankoding.com

Membuat Page Views / Read Count Artikel di Laravel

Jumat, 12 April 2024
Membuat Page Views / Read Count Artikel di Laravel

Dalam membuat website apalagi blog, hampir dipastikan kita kepo atau ingin tahu berapa banyak sih sebuah artikel ini dibaca orang. Tentu saja ini hal yang cukup penting karena kita bisa menganalisa artikel artikel mana yang diminati dan bisa lebih banyak membuat konten tentang hal tersebut.

Membuat Page Views / Read Count dengan Increment

Pertama, cara yang paling simpel dan praktis adalah menambahkan sebuah kolom pada tabel artikel / pos kita dengan nama post_views atau article_views atau nama lainnya yang kita kehendaki aja lah ya.

Kemudian, untuk menambahkan perhitungannya cukup mudah, logikanya, setiap ada orang yang membuka halaman kita, langsung increment aja, kurang lebih seperti ini lah, maka post_views otomatis akan bertambah setiap ada yang membuka halaman tersebut.

public function show(Post $post)
{
    $post->increment('post_views');

    return view('post.show', [
        'post' => $post
    ]);
}

Menggunakan Tabel Baru & Deteksi IP Address

Untuk cara pertama memang bisa saja kita gunakan, cuma mungkin data yang ada kurang valid, karena setiap kunjungan akan dihitung 1 increment. Nah untuk hasil yang lebih oke / valid kita bisa gunakan deteksi IP Address.

Pertama yang perlu dilakukan adalah membuat model dan tabel baru untuk menyimpan datanya.

php artisan make:model PostView -m

Lalu pada file migration sesuaikan dengan kode di bawah ini.

public function up(): void
{
    Schema::create('post_views', function (Blueprint $table) {
        $table->id();
        $table->foreignId('post_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate();
        $table->string('ip_address');
        $table->timestamps();
    });
}

Di sini saya anggap, kita sudah punya model Post ya untuk membuat artikel / pos tadi. Sekarang buat relasi dari Post ke PostView.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    public function views(): HasMany
    {
        return $this->hasMany(PostView::class);
    }
}

Kemudian, kita tangani proses menambahkan data post_views di controller.

use App\Models\PostView;

/* ..... */

public function show(Post $post)
{
    PostView::updateOrCreate([
        'post_id' => $post->id,
        'ip_address' => request()->ip(),
    ]);

    return view('post.show', [
        'post' => $post
    ]);
}

Nah, kode ini akan menghitung atau menambahkan data hanya jika pada sebuah postingan / artikel dikunjungi oleh pengunjung yang unik (ip address berbeda).

Kemudian untuk menampilkan jumlah views nya, bisa seperti ini.

return view('post.show', [
    'post' => $post->loadCount('views'),
]);

Terus, pada file show.blade.php kita bisa panggil seperti ini.

{{ $post->views_count }}

Nah, cara yang kedua ini yang saya gunakan di [https://bacaan.dev](Bacaan Developer).