Siéntete en la libertad de compartir nuestro espacio y códigos con tus amigos, ayúdanos a ampliar esta comunidad.
Solución:
No estoy 100% seguro de esto, pero deberías poder hacer algo como esto. No está probado y puede haber una manera más elegante de hacerlo, pero es un punto de partida para usted.
cambia la mesa
Cambiar el visit_date (datetime)
columna en visit_date (date)
y visit_time (time)
columnas, luego crea un id
columna para ser la primaria key. Por último, establezca ip + date
ser unico key para asegurarse de que no puede tener la misma IP ingresada dos veces por día.
Crear un modelo Elocuente
Esto es solo para facilitar: cree un modelo Eloquent para la tabla para que no tenga que usar Fluent (constructor de consultas) todo el tiempo:
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('Y-m-d'),
])->save();
Ahora deberías poder hacer lo que quieras simplemente llamando a esto:
Tracker::hit();
Mirando su código y leyendo su descripción, asumo que desea calcular la cantidad de visitas de una dirección IP por día. Podrías hacer esto usando Eloquent’s updateOrNew()
método:
$ip = Request::getClientIp();
$visit_date = Carbon::now()->toDateString();
$visitor = Visitor::findOrNew(compact('ip', 'visit_date'));
$visitor->increment('hits');
Sin embargo, agregaría esto a una cola para que no acceda a la base de datos en cada solicitud y se pueda incrementar el número de visitas a través de un proceso en segundo plano:
Queue::push('RecordVisit', compact('ip', 'visit_date'));
En términos de dónde iniciar esto, el App::before()
el filtro suena como un buen candidato:
App::before(function($request)
{
$ip = $request->getClientIp();
$visit_date = Carbon::now()->toDateString();
Queue::push('RecordVisit', compact('ip', 'visit_date'));
);
Puede ir un paso más allá escuchando este evento en un proveedor de servicios y activando su cola de trabajo allí, de modo que su contador de visitas sea su propio componente autónomo y pueda agregarse o eliminarse fácilmente de este y cualquier otro proyecto.
¡Gracias a @Joe por ayudarme por completo!
@Martin, también gracias, pero los scripts de @Joe funcionaron para mi problema.
La solución:
Tracker::hit();
Dentro de mi aplicación::before();
Y una nueva clase:
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('Y-m-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('Y-m-d'));
public static function hit()
static::firstOrCreate([
'ip' => $_SERVER['REMOTE_ADDR'],
'date' => date('Y-m-d'),
])->save();
Llamado ‘rastreador’ 🙂
Si te gusta la idea, eres capaz de dejar un post acerca de qué le añadirías a esta división.