Я пытаюсь построить счетчик посетителей в 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(); } }
Именованный «трекер» 🙂