我正在使用OctoberCMS构建应用程序,并希望根据类别列出每个帖子页面底部的相关博客帖子。我想通了rainlab_blog_posts表没有指向博客类别表的外键。为了达到想要的目的,我想扩展blog_posts表并使用插件将category_id添加为外键。我在表迁移中定义了外键约束。 Everthing似乎很好。我的挑战是,每次创建新帖子时,如何在posts表中插入类别ID。 OctoberCMS创建帖子后端有一个选项,作者通过从列表中选择为新博客帖子分配类别。只是不明白如何传递此类别ID并插入category_id字段中的rainlab_blog_posts表。
这是我想要在我的API中实现的目标:
routes.php文件
use Rainlab\Blog\Models\Post;
Route::get('apiv1/related-posts/{postid}',function($id)
{
$post = Post::where('id',$id)->first();
$posts = Post::where('category_id',$post->category_id)
->where('id','!=',$id)
->orderBy('views','desc')
->get()->take(5);
return $posts;
});
或者,如果有更好的方法实现这一点,将会欣赏。干杯!
答案 0 :(得分:2)
嗯这里似乎有点不对劲,
首先,我可以从Blog Plugin
看到Blog <=> Category
MM 关系,因此您不会在category_id
中找到rainlab_blog_posts
此all relation
表mm-relation
<{}}表格rainlab_blog_posts_categories
维护。
所以我认为你会select only one category for blog
所以你可以get related blogs
仅针对那个类别。 [根据您的代码和说明假设]
我们可以利用关系。
所以你的代码看起来像这样
use Rainlab\Blog\Models\Post;
Route::get('apiv1/related-posts/{postid}', function($id)
{
$post = Post::where('id',$id)->first();
// we need this because there will be mm relation so
// we fetch first category and this will be based on
// [ name sorting - does not matter as there will be only one cat. ]
$firstCategory = $post->categories()->first();
// now we fetch only that post which are related to that category
// but we skip current post and sort them and pick 5 posts
$posts = $firstCategory->posts()
->where('id', '!=', $id)
->orderBy('views','desc')
->limit(5) // use limit instead of take()
->get();
// use limit instead of take() as we don't need extra data so
// just put limit in sql rather fetching it from db then
// putting limit by code - limit() is more optimised way
return $posts;
});
现在好了,你不需要在
category_id
上添加rainlab_blog_posts
字段。 所以,我猜你现在也不用担心在插入后添加它。
如有疑问请发表评论。
答案 1 :(得分:1)
如果您只想显示相关博客文章而不必自定义博客数据库,则有一个名为Related Articles的OctoberCMS插件 需要rainlab博客插件。它将显示属于该帖子类别的所有其他文章。