使用有意义的表名
根据您的要求,您可以命名记录视图的表,例如“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'));
}
}
最好不要这样做。在控制器代码中记录视图有两个重要的问题:
- 它正在录制生成视图,而不是用户看到它(不一定是同一件事)
- 它会干扰缓存(在 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;
}
}
这样,无论用户如何阅读内容,都有用户查看相关页面的记录。