使用 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}
。这将为您将来省去很多麻烦。对于查看您的代码的人来说,它也会省去很多麻烦。
我有 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}
。这将为您将来省去很多麻烦。对于查看您的代码的人来说,它也会省去很多麻烦。