我想在拉勒维尔建一个访客柜台..。
我不知道最好的地方是把代码放在里面,这样它就能在每一页上加载.但我把它塞进了routes.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值并在该列中计数?
发布于 2015-04-17 09:11:18
我不是百分之百肯定,但你应该能做这样的事情。它没有经过测试,而且可能有一种更优雅的方法来实现它,但它是您的起点。
更改表
将visit_date (datetime)列更改为visit_date (date)列和visit_time (time)列,然后创建作为主键的id列。最后,将ip + date设置为唯一的密钥,以确保同一IP不能在一天内输入两次。
创建了一个雄辩的模型
这只是为了方便:为表建立一个雄辩的模型,这样您就不必一直使用Fluent (查询生成器):
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();
}
}现在,你应该能够做你想做的事,只需将其称为:
Tracker::hit();发布于 2015-04-17 11:43:00
查看您的代码并阅读您的描述,我假设您希望每天从一个IP地址中计算命中次数。您可以使用雄辩的updateOrNew()方法来做到这一点:
$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'));
);您可以更进一步,在服务提供者中侦听此事件并在那里触发队列作业,以便您的访问计数器是它自己的独立组件,并且可以轻松地从该项目和任何其他项目中添加或删除。
发布于 2015-04-17 16:38:26
感谢乔帮了我大忙!
@Martin,你也很感谢,但是“Joe”的剧本解决了我的问题。
解决办法:
Tracker::hit();在我的应用程序中::在()之前
和一个新的班级:
<?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('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();
}
}名为“跟踪器”:)
https://stackoverflow.com/questions/29694372
复制相似问题