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).