首页 > 解决方案 > Laravel 对类别进行多选过滤,只得到一个选择作为输出

问题描述

在 laravel 8 中,我按类别过滤博客文章。但是,当我在选择菜单中选择多个类别时。我确实得到了正确的要求。例如:articles/category/?category_ids=3,4

但它只会输出一个选定的过滤器。如果我选择 2 个过滤器,它只会选择下一个过滤器,就好像我只选择了那个过滤器一样。(我也使用 Axios,但请求正确完成,所以它在我的控制器中)

这是我尝试过的代码:

   $data['articles'] = Article::whereHas('categories', function ($query) use($category_ids){
            $query->whereHas('category_id', '=', $category_ids)->where('premium',0);
        ;})->get();

我也试过:

 $data['articles'] = Article::whereHas('categories', function ($query) use($category_ids){
            $query->whereIn('category_id', [$category_ids])->where('premium',0);
        ;})->get();

那么如何查询两个或多个类别 ID 呢?

我正在使用数据透视表:

文章可以有多个类别

类别可以有很多文章

我使用 article_category 作为数据透视表

标签: phplaravelfiltereloquent

解决方案


在多对多关系中检查关系是否存在时,仍需对类别表中的 id 进行检查。

尝试这个

$category_ids = collect(explode(',', $request->category_ids))
    ->map(fn($i) => trim($i))
    ->all();

$data['articles'] => Article::whereHas('category', fn($query) => 
    $query->whereIn('categories.id', $category_ids)
        ->where('categories.premium', 0)
)->get();


推荐阅读