Счетчик посещений Laravel

Я пытаюсь построить счетчик посетителей в Laravel ….

Я не знаю, какое лучшее место для того, чтобы поместить код внутрь, чтобы он загружался на КАЖДОЙ странице … Но я поместил его внутри route.php ….

Думаю, мне лучше разместить его внутри базового контролера?

Но хорошо, мой код выглядит следующим образом:

//stats $date = new \DateTime; $check_if_exists = DB::table('visitor')->where('ip', $_SERVER['REMOTE_ADDR'])->first(); $get_visit_day = DB::table('visitor')->select('visit_date')->where('ip', $_SERVER['REMOTE_ADDR'])->first(); $value = date_create($get_visit_day->visit_date); if(!$check_if_exists) { DB::table('visitor')->insert(array('ip' => $_SERVER['REMOTE_ADDR'], 'hits' => '1', 'visit_date' => $date)); }else{ DB::table('visitor')->where('ip', $_SERVER['REMOTE_ADDR'])->increment('hits'); } $value = date_create($get_visit_day->visit_date); if ($check_if_exists && date_format($value, 'd') != date('d')) { DB::table('visitor')->insert(array('ip' => $_SERVER['REMOTE_ADDR'], 'hits' => '1', 'visit_date' => $date)); } 

Это хорошо работает, но проблема в том, что мои столбцы базы данных всегда добавляют новое значение.

Итак, это моя база данных: С таблицей «посетитель»

Из таблицы «посетитель».

Он продолжает добавлять новый IP, hit и visit_date …

Как можно просто обновлять хиты с сегодняшнего дня (день) и, если день прошел, установить новое значение IP и подсчитать в этом столбце?

Я не уверен на этом, но вы должны сделать что-то подобное. Это не проверено, и может быть более элегантный способ сделать это, но это отправная точка для вас.

Измените таблицу

Измените visit_date (datetime) столбцы visit_date (date) и visit_time (time) , а затем создайте столбец id который будет основным. Наконец, установите ip + date как уникальный ключ, чтобы вы не могли дважды вводить один и тот же IP-адрес за один день.

Создайте яркую модель

Это просто для облегчения: создайте модель Eloquent для таблицы, так что вам не нужно постоянно использовать Fluent (query builder):

 class Tracker extends Eloquent { public $attributes = [ 'hits' => 0 ]; protected $fillable = [ 'ip', 'date' ]; protected $table = 'table_name'; public static function boot() { // Any time the instance is updated (but not created) static::saving( function ($tracker) { $tracker->visit_time = date('H:i:s'); $tracker->hits++; } ); } public static function hit() { static::firstOrCreate([ 'ip' => $_SERVER['REMOTE_ADDR'], 'date' => date('Ym-d'), ])->save(); } } 

Теперь вы должны будете делать все, что хотите, просто называя это:

 Tracker::hit(); 

Если вы посмотрите на свой код и прочитаете свое описание, я предполагаю, что вы хотите рассчитать количество обращений по IP-адресу в день. Вы можете сделать это, используя метод updateOrNew() Eloquent:

 $ip = Request::getClientIp(); $visit_date = Carbon::now()->toDateString(); $visitor = Visitor::findOrNew(compact('ip', 'visit_date')); $visitor->increment('hits'); 

Тем не менее, я бы добавил это в очередь, чтобы вы не попадали в базу данных по каждому запросу, и увеличение вашего количества попаданий можно выполнить с помощью фонового процесса:

 Queue::push('RecordVisit', compact('ip', 'visit_date')); 

С точки зрения загрузки, фильтр App::before() звучит как хороший кандидат:

 App::before(function($request) { $ip = $request->getClientIp(); $visit_date = Carbon::now()->toDateString(); Queue::push('RecordVisit', compact('ip', 'visit_date')); ); 

Вы можете сделать еще один шаг, прослушав это событие у поставщика услуг и уволив свою работу в очереди, чтобы ваш счетчик посещений был его собственным автономным компонентом и может быть легко добавлен или удален из этого и любых других проектов.

Спасибо @ Joe за то, что помогли мне отправиться!

@Martin, вы также благодарите, но скрипты @Joe работали на мою проблему.

Решение:

 Tracker::hit(); 

Внутри моего приложения :: before ();

И новый класс:

 <?php class Tracker Extends Eloquent { public $attributes = ['hits' => 0]; protected $fillable = ['ip', 'date']; public $timestamps = false; protected $table = 'visitor'; public static function boot() { // When a new instance of this model is created... static::creating(function ($tracker) { $tracker->hits = 0; } ); // Any time the instance is saved (create OR update) static::saving(function ($tracker) { $tracker->visit_date = date('Ym-d'); $tracker->visit_time = date('H:i:s'); $tracker->hits++; } ); } // Fill in the IP and today's date public function scopeCurrent($query) { return $query->where('ip', $_SERVER['REMOTE_ADDR']) ->where('date', date('Ym-d')); } public static function hit() { static::firstOrCreate([ 'ip' => $_SERVER['REMOTE_ADDR'], 'date' => date('Ym-d'), ])->save(); } } 

Именованный «трекер» 🙂