使用 OctoberCMS 显示单个类别的帖子

Display single category posts with OctoberCMS

我有 table 个包含字段的类别 - id、类别。
我有 table 个包含字段的帖子 - id、标题、描述。
我有带字段的数据透视 table - category_id、post_id。

我如何创建路线来显示一个类别的所有帖子?我试过:

Route::get('category/{id}', function($id) {
  $posts = Post::with(['image','category'])->where('category.id', $id)->get();
  return $posts;
});

但我收到未知列错误。

首先,您应该在 Post 模型中定义如下关系:

public $belongsToMany = [
    'categories' => [
        'Your\PLugin\Models\Category',
        'table'    => 'categories_table',
        'key'      => 'post_id',
        'otherKey' => 'category_id'
    ],
];

然后,您可以像这样访问与 post 相关的类别:

$post = Post::find($post_id);
$post_categories = $post->categories;

有几种方法可以解决这个问题。我将向您展示 laravel 方法和 whereHas 方法。可以看看文档here。我几乎没有使用 with 方法,因此您可能需要进行试验,但我会这样做。

$posts = Post::with('image')->whereHas('category', function ($category) use ($id) {
    $category->where('id', $id);
})->get();

为什么我认为您的查询不起作用是因为您的 ->where('category_id', $id) 是直接在 Post 模型上完成的,我敢打赌它没有 category_id。您无法从其中一个关系模型访问数据透视表 table 字段。您始终可以通过 die 和 dump 来查看集合属性; dd($posts).

将来要考虑的一个重要提示是 create/use 显式变量。不要使用 category/{id},而是使用 category/{categoryId}。这将为您将来省去很多麻烦。对于查看您的代码的人来说,它也会省去很多麻烦。