0

我有一个带有帖子和喜欢的系统(与模型正确链接)。我想获得最喜欢的帖子。

在查看 CakePHP 的文档后,我在 1.2 文档中找到了一些内容:counterCache. 但是,它似乎不再适用于 CakePHP 2.x。

那么,你有一个解决方案来获得最喜欢的帖子吗?

这些表是非常基础的:id 并为每个创建并与 post_id 链接以获取喜欢,这里是likes表:

========================================
|| *id* | created | post_id | user_id ||
========================================
4

2 回答 2

0

您可以使用CounterCache来实现这一点,但这意味着将 HABTM 替换为“ hasMany through

你会有这样的事情:

<?php
class Post extends AppModel {
    public $hasMany = array('Like');
    // Note that the "posts" table must have a "like_count" integer field
}
class Like extends AppModel {
    public $belongsTo = array(
        'User',
        'Post' => array('counterCache' => true)
    );
}
class User extends AppModel {
    public $hasMany = array('Like');
}
于 2012-10-09T04:43:10.317 回答
0

强制加入帖子和点赞,并查询COUNT()点赞数、GROUP BY计数器、ORDER BY计数器降序和LIMIT x顶部 x;

试试这个,我假设模型命名为PostLike和一个连接表:

$options = array();
$options['joins'][] = array('table' => 'likes_posts', 'alias' => 'LikePost', 'conditions' => array('LikePost.post_id = Post.id'));
$options['joins'][] = array('table' => 'likes', 'alias' => 'Like', 'conditions' => array('LikePost.like_id = Like.id'));
$options['fields']  = array('COUNT(Like.id) AS counter', 'Post.*');
$options['group']   = 'Like.id';
$options['limit']   = 1; //you could easily get the top 3, top 5, top 10...
$options['order']   = 'counter DESC';
$data = $this->Post->find('all', $options);
$this->set('data', $data);
于 2012-10-02T14:00:35.207 回答