原文来自:https://jellybool.com/post/setup-pages-views-count-on-your-blogphp
因为最近都在搭建本身的博客,像一些基本的功能如文章的发表,编辑等功能在以前就实现好了,今天主要是说说本身在实现浏览次数的统计上的解决方法。git
在Laravel中,利用Eloquent的One-To-Many的关系,实现一篇文章有多条浏览记录,具体思路以下:github
用户访问文章页面-->取得ip地址和文章id,存入数据库 再次访问时根据ip和文章id判断是否新增记录
利用weboAp/VisitorPackage能够轻松实现,具体步骤以下:web
{ "require": { "weboap/visitor": "dev-master" } }
而后执行:数据库
composer update
config/app.php
中:'Weboap\Visitor\VisitorServiceProvider'
以后再执行下面两个命令:json
php artisan vendor:publish php artisan migrate
到http://dev.maxmind.com/geoip/geoip2/geolite2/下载geoip包(GeoLite2-City.mmdb),将它解压以后放到如下目录数组
storage/geo/
固然/geo
是须要本身建立的目录。app
上面的步骤以后你将会获得一个表visitor_registry
,这里咱们首先为visitor_registry
添加一个字段article_id
用于One-To-Many的关系。composer
php artisan make:migration add_article_id_to_visitor_registry --table='visitor_registry'
在生成的migration大概是这样写:ide
public function up() { Schema::table('visitor_registry', function (Blueprint $table) { $table->integer('article_id')->unsigned()->index(); $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade'); }); }
php artisan make:model VisitorRegistry
在VisitorRegistry.php
中写上一下代码:
protected $table = 'visitor_registry'; protected $fillable = ['clicks']; public function articles() { return $this->belongsTo('App\Article'); }
上面咱们经过articles()
声明了VisitorRegistry
对Article
的关系,因而在Article中也声明关系:
public function visitors() { return $this->hasMany('App\VisitorRegistry'); }
关系修改完毕以后,因为咱们为visitor_registry
表添加了article_id
字段,因此咱们须要修改weboAp/VisitorPackage中Visitor.php
文件的log()
方法,由于这个就是执行插入数据的实际方法,咱们首先给它闯入一额文章的id:
public function log($article_id){}
而后对log()
方法里面修改第二个条件判断:
if( $this->has( $ip ) && $this->hasArticle($article_id) ) { //ip already exist in db. $visitor = VisitorRegistry::where('ip','=',$ip)->where('article_id','=',$article_id)->first(); $visitor->update(['clicks'=>$visitor->clicks + 1]); return true; }
上面咱们本身添加了一个hasArticle($article_id,$ip),咱们能够直接将这个方法写在Visitor.php中:
public function hasArticle($id,$ip) { return count(VisitorRegistry::where('article_id','=',$id)->where('ip','=',$ip)->get()) > 0; }
最后咱们还要修改log()中的插入数据的数组数据$data:
$data = array( 'ip' => $ip, 'country' => $country, 'clicks' => 1, 'article_id' => $article_id, 'updated_at' => c::now(), 'created_at' => c::now() );
咱们就添加'article_id' => $article_id
,到这里,咱们的准备工做作好了,而后在ArticleController中的show($id)方法使用:
Visitor::log($id);
有了数据以后咱们能够将它展现给用户看,在展现文章的页面写上相似下面的内容:
<li><i class="fa fa-eye"></i>{{ count($article->visitors) }} 浏览</li>
打完收工,很开心。
Happy Hacking