1

我有两张桌子:

表格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。

4

1 回答 1

3

使用有意义的表名

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

tbl_post_views
-id
-user_id
-post_id

如果tbl_不是前缀 - 删除它是常规的。

因此会有一个名为 PostView 的模型同时属于帖子和用户:

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 或用户的浏览器中)

使用图像信标

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

// 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;
    }
}

这样,无论用户如何阅读内容,都有用户查看相关页面的记录。

于 2013-10-07T17:13:21.330 回答