CakePHP:创建一个视图计数

时间:2013-10-07 16:46:48

标签: php mysql cakephp

我有两张桌子:

表1:

tbl_posts
-id
-name

表2:

tbl_users
-id
-name

现在我想要计算有多少用户看过任何帖子并保留缓存数量。

我会为此创建一个表: (不确定是否是关联的正确名称)

tbl_posts_users 
-id
-user_id
-post_id

现在我的问题: 关联表的正确方法是什么?我的意思是,当用户访问某些帖子时,插入tbl_posts_users(没有重复的寄存器),并且还有两个计数: 一个在tbl_users中,计算用户看到的帖子数量 一个在tbl_posts中,计算有多少用户看过该帖子。

在文档中,我不明白我应该使用什么方法,如果我应该定义belongsTo或hasMany。

1 个答案:

答案 0 :(得分:3)

使用有意义的表名

根据您的要求,您可以将记录视图的表命名为“post_views”(即用户查看帖子):

tbl_post_views
-id
-user_id
-post_id

如果tbl_不是前缀 - 请将其删除为常规。

因此,会有一个名为PostView的模型属于post和user:

class PostView extends AppModel {

    public $belongsTo = array('Post', 'User');

}

不要使用您的视图操作来跟踪视图

目前最有可能的目的是实现这样的目标:

class PostsController extends AppController {

    public $uses = array('Post', 'PostView');

    public function view($id) {
        $this->PostView->save(array('user_id' => $this->Auth->user('id'), 'post_id' => $id));
        $data = $this->Post->findById($id);
        $this->set(compact('data'));

    }
}

这样做更好。在控制器代码中记录视图有两个重要问题:

  1. 正在录制生成视图,而不是用户看到它(不一定是同一件事)
  2. 它干扰缓存(在php或用户的浏览器中)
  3. 使用图像信标

    不是在发出请求时记录视图,而是在渲染输出中包含“图像信标”:

    // end of file View/Posts/view.ctp
    echo $this->Html->image(array('action' => 'viewed', $postId), array('class' => 'beacon'));
    

    在你的帖子控制器中 - 记录帖子已被查看,并输出一个有效的图像(否则会有用户浏览器报告的错误),并带有适当的标题,永远不会缓存响应:

    class PostsController extends AppController {
    
        ...
    
        public function viewed($id) {
            $this->PostView->save(array('user_id' => $this->Auth->user('id'), 'post_id' => $id));
            $this->response->disableCache();
            $this->response->file('webroot/img/1px.gif'); // a 1px gif
            return $this->response;
        }
    }
    

    通过这种方式,无论用户如何阅读内容,都会有用户查看相关页面的记录。