首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel访客柜台

Laravel访客柜台
EN

Stack Overflow用户
提问于 2015-04-17 08:43:13
回答 5查看 26.4K关注 0票数 10

我想在拉勒维尔建一个访客柜台..。

我不知道最好的地方是把代码放在里面,这样它就能在每一页上加载.但我把它塞进了routes.php..。

我想我最好把它放在基准局里?

好吧,我的代码现在看起来是这样的:

代码语言:javascript
复制
    //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值并在该列中计数?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-04-17 09:11:18

我不是百分之百肯定,但你应该能做这样的事情。它没有经过测试,而且可能有一种更优雅的方法来实现它,但它是您的起点。

更改表

visit_date (datetime)列更改为visit_date (date)列和visit_time (time)列,然后创建作为主键的id列。最后,将ip + date设置为唯一的密钥,以确保同一IP不能在一天内输入两次。

创建了一个雄辩的模型

这只是为了方便:为表建立一个雄辩的模型,这样您就不必一直使用Fluent (查询生成器):

代码语言:javascript
复制
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();
    }

}

现在,你应该能够做你想做的事,只需将其称为:

代码语言:javascript
复制
Tracker::hit();
票数 13
EN

Stack Overflow用户

发布于 2015-04-17 11:43:00

查看您的代码并阅读您的描述,我假设您希望每天从一个IP地址中计算命中次数。您可以使用雄辩的updateOrNew()方法来做到这一点:

代码语言:javascript
复制
$ip = Request::getClientIp();
$visit_date = Carbon::now()->toDateString();

$visitor = Visitor::findOrNew(compact('ip', 'visit_date'));
$visitor->increment('hits');

但是,我会将其添加到队列中,这样就不会在每个请求上命中数据库,并且可以通过后台进程来增加命中计数:

代码语言:javascript
复制
Queue::push('RecordVisit', compact('ip', 'visit_date'));

就启动位置而言,App::before()过滤器听起来是一个很好的候选:

代码语言:javascript
复制
App::before(function($request)
{
    $ip = $request->getClientIp();
    $visit_date = Carbon::now()->toDateString();

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

您可以更进一步,在服务提供者中侦听此事件并在那里触发队列作业,以便您的访问计数器是它自己的独立组件,并且可以轻松地从该项目和任何其他项目中添加或删除。

票数 5
EN

Stack Overflow用户

发布于 2015-04-17 16:38:26

感谢乔帮了我大忙!

@Martin,你也很感谢,但是“Joe”的剧本解决了我的问题。

解决办法:

代码语言:javascript
复制
Tracker::hit();

在我的应用程序中::在()之前

和一个新的班级:

代码语言:javascript
复制
<?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();
    }
}

名为“跟踪器”:)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29694372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档