Rob*_*bin 9 php mysql laravel-4
我正试图在Laravel建立一个访客柜台....
我不知道最好的地方是把代码放在里面以便它加载到每个页面上......但是我把它放在routes.php里面....
我想我最好把它放在basecontroller里面?
但没关系,我的代码现在看起来像这样:
//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));
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但问题是,我的数据库列总是添加一个新值.
这是我的数据库:

从表'访客'.
它不断添加新的IP,hit和visit_date ......
如何才能从今天(当天)更新点击量,如果过了一天,设置一个新的IP值并计入该列?
Joe*_*Joe 13
我对此并不是100%肯定,但你应该可以做这样的事情.它没有经过测试,可能有一种更优雅的方式,但它是你的起点.
改变表格
将visit_date (datetime)列更改为列visit_date (date)和visit_time (time)列,然后创建一个id列作为主键.最后,设置ip + date为一个唯一的密钥,以确保您不能在一天内输入两次相同的IP.
创建一个雄辩的模型
这只是为了方便:为表创建一个Eloquent模型,这样您就不必一直使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在你应该能够通过调用它来做你想做的事情:
Tracker::hit();
Run Code Online (Sandbox Code Playgroud)
查看您的代码并阅读您的描述,我假设您想要计算每天IP地址的点击次数.你可以使用Eloquent的updateOrNew()方法做到这一点:
$ip = Request::getClientIp();
$visit_date = Carbon::now()->toDateString();
$visitor = Visitor::findOrNew(compact('ip', 'visit_date'));
$visitor->increment('hits');
Run Code Online (Sandbox Code Playgroud)
但是,我会将其添加到队列中,因此您不会在每个请求中访问数据库,并且可以通过后台进程增加命中计数:
Queue::push('RecordVisit', compact('ip', 'visit_date'));
Run Code Online (Sandbox Code Playgroud)
在哪里引导这个,App::before()过滤器听起来像一个很好的候选人:
App::before(function($request)
{
$ip = $request->getClientIp();
$visit_date = Carbon::now()->toDateString();
Queue::push('RecordVisit', compact('ip', 'visit_date'));
);
Run Code Online (Sandbox Code Playgroud)
您可以通过在服务提供商中侦听此事件并在那里触发队列作业来更进一步,这样您的访问计数器就是它自己的独立组件,可以轻松地从此项目和任何其他项目中添加或删除.
| 归档时间: |
|
| 查看次数: |
13905 次 |
| 最近记录: |