如何在 CakePHP 中实现 "related posts" 元素?

How to implement a "related posts" element in CakePHP?

我的主要模型是 Post,它填充了许多不同的信息字段(名称、名称、状态、创建、修改等),其中之一是它与类别模型的关系。 (Post属于Category,Category有很多Post。)

到目前为止一切正常。我可以保存和编辑 category_id,每个类别都有一个索引,每个 post 属于它。一切都是桃色的。

现在我需要实现一个特殊的额外功能,但我对可能的解决方案的所有搜索都是徒劳的。我有一些想法,但我不知道如何实施这些想法,而且我不确定在这种情况下最佳做法是什么。

我需要在 view 视图中 post 的信息下方添加一个 "Similar/Related posts" 模块,加载一些基本信息(名称、名称、创建日期等)来自与当前 post.

相同类别的 3 个随机 post

我想我可以尝试在元素中使用 find('all') 函数(从视图操作中将 category_id 作为变量加载)。

这是我的控制器:

class PostsController extends AppController {

    public function view($id) {

        if (!$id) {
            throw new NotFoundException(__('Invalid post.'));
        }

        $post = $this->Post->findById($id);
        if (!$post) {
            throw new NotFoundException(__('Post not found.'));
        }

        $this->set('post', $post);
    }
}

在 Post 模型中我有:

class Post extends AppModel {
    public $belongsTo = array('Category');
}

在类别模型中我有:

public $hasMany = array(
    'Post' => array(
        'className' => 'Post',
        'foreignKey' => 'category_id',
        'dependent' => false
    )
);

目前我只需要在 view 视图中加载那些 "related posts",但我不确定以后是否不需要这样做。 (这就是为什么我在考虑模块的元素。)

在视图中编写查询不太好,您可以使用帮助程序或直接在控制器本身中执行,在您的控制器中您可以尝试以下代码:

class PostsController extends AppController {

    public function view($id) {

        if (!$id) {
            throw new NotFoundException(__('Invalid post.'));
        }

        $post = $this->Post->findById($id);
        if (!$post) {
            throw new NotFoundException(__('Post not found.'));
        }

        $relatedPosts = $this->Post->find('all', array('conditions' => array('Post.category_id' => $post['Post']['category_id'], 'NOT' => array('Post.id' => $id)), 'limit' => 3));

        $this->set('relatedPosts', $relatedPosts);
        $this->set('post', $post);
    }
}

然后在您的视图中您可以检查 !empty($relatedPosts) 并在其中循环 $relatedPosts 并显示您想要显示的任何字段。