如何在 laravel 中按类别过滤 post?

How to filter post by category in laravel?

我目前正在尝试建立 3 个表之间的关系。

post
    id
    name
category
    id
    name
post_category
    id
    post_id
    category_id

数据库

post
|   1   |   post1   |
|   2   |   post2   |
|   3   |   post3   |
category
|   1   |    cat1   |
|   2   |    cat2   |
|   3   |    cat3   |
post_category
|   1   |   1   |   1   |
|   2   |   2   |   1   |
|   3   |   3   |   2   |
|   3   |   2   |   2   |
|   3   |   1   |   3   |
型号 Post.php
public function getCategory()
{
return $this->belongsToMany(Category::class, 'post_category');
}
PostController.php
$data = Post::with('getCategory')->get();
它 returns 正确 post 列表。
现在我想按类别过滤 post。我试过了,但没用
$categoryId = [1,2];
$data = Post::with('getCategory')->whereHas('category', function ($query) use ($categoryId) {
$query->whereIn('id', $categoryId);
})->orderBy('id','DESC')->get();
请帮我 使用 Laravel 5.4

您应该将 getCategory() 函数重命名为 category()。这使得关系名称更加直接,并且可能会解决您的问题。

那么,您应该可以调用 whereHas('category', ...)

如果它仍然不起作用,只需将 ->toSql() 链接到您的任何查询并以此方式调试实际查询。

显然一切都很好!

一个建议是在 belongsToMany 方法中再添加两个参数,例如:

public function getCategory()
{
    return $this->belongsToMany(Category::class, 'post_category', 'post_id', 'category_id');
}

https://laravel.com/api/7.x/Illuminate/Database/Eloquent/Concerns/HasRelationships.html#method_belongsToMany