我有两张桌子:
表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。
答案 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'));
}
}
不这样做更好。在控制器代码中记录视图有两个重要问题:
不是在发出请求时记录视图,而是在渲染输出中包含“图像信标”:
// 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;
}
}
通过这种方式,无论用户如何阅读内容,都会有用户查看相关页面的记录。