如何使用多个类别过滤帖子?
Posted
技术标签:
【中文标题】如何使用多个类别过滤帖子?【英文标题】:How to filter posts by using multiple category? 【发布时间】:2022-01-14 18:58:01 【问题描述】:我到处尝试,但找不到任何解决方案:(,例如,我想使用类别复选框搜索帖子,如果用户检查摄影和绘画类别,它只显示具有 $category_slug=photography 的帖子或$category_slug=drawing 但它仅在我检查一个类别类型时才有效,如果我选择多个类别类型,它不会返回任何内容。请帮助
刀片
@if (isset($categories))
@foreach ($categories as $category)
<div class="list-group-item checkbox">
<label>
<input type="checkbox" class="common_selector category" name="cate[]" value=" $category->slug ">
$category->name
</label>
</div>
@endforeach
@endif
控制器
public function search(Request $request)
$categories = Category::all();
$txtSearch = $request->input('q');
if (isset($txtSearch))
$query = Post::where('title', 'LIKE', "%$txtSearch%")->orderBy('id', 'DESC');
else
$query = Post::orderBy('id', 'DESC');
if ($request->has('cate'))
$categoryType = $request->input('cate');
foreach ($categoryType as $category)
$query->where('category_slug', $category);
$queryResults = $query->paginate(20);
return view('searchPage, ['categories' => $categories, 'queryResults' => $queryResults]);
感谢您的帮助。
【问题讨论】:
为什么没有数据透视表来链接posts
和categories
?似乎你在posts
上有一个category_slug
字段,那怎么会有多个值? (您的设置怎么可能有多个类别?)
@lagbox category_slug 是 Posts 表的 FK 列,它引用 categories 中的 slug 列 表。我认为它不需要数据透视表,因为我只有 6 个类别。此外,帖子只有一种类别类型。
该列只能保存 1 个值,那么一个帖子怎么可能有多个类别呢? “如果用户检查摄影和绘画类别,它只显示具有两个类别的帖子” ...帖子怎么可能同时拥有这两个类别?
我知道一个帖子只有一个类别类型,但我想展示这样的内容select * from posts where category_slug = photography or category_slug = drawing
这两者都不是......这是一个或另一个......whereIn
怎么样,你可以传递一个类别数组
【参考方案1】:
基本上你想说你想找到属于任何被选中的categories
的任何posts
。您可以在循环中使用带有orWhere
s 的where
或使用whereIn
。以下是使用whereIn
的示例:
if ($request->has('cate'))
$query->whereIn('category_slug', (array) $request->input('cate', []));
如果您验证输入 cate
是一个数组,您可以从该数组中删除 (array)
转换并将第二个参数删除到 input
。
Laravel 8.x Docs - Query Builder - Additional Where ClauseswhereIn
【讨论】:
谢谢,它有效。以上是关于如何使用多个类别过滤帖子?的主要内容,如果未能解决你的问题,请参考以下文章