如何在 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 并显示您想要显示的任何字段。
我的主要模型是 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 并显示您想要显示的任何字段。