发布于 2021-01-22 16:31:43
我完全按照您对TNTSearch驱动程序所做的做了,我得出了一个困难的结论: Scout根本不支持默认的QueryBuilder对象所做的广泛的查询处理。这是故意的。如果您阅读了Scout文档,就会清楚地表明,在应用所有通常需要的筛选/排序查询之前,必须执行搜索。因此,可以这样想:搜索>筛选,并对搜索结果进行排序。
话虽如此,实现你想要的是有可能的。它只需要两个查询,而不是一个查询。也许总有一天童子军会得到更好的支持。
我就是这样做的:
设置一个变量以保存搜索结果ids。
$searchIds = blank($request->kw) ? [] : Job::search($this->search)->keys();searchIds现在要么是空数组,要么是模型ids的数组。现在,您可以利用斯帕蒂的QueryBuilder对象应用您的过滤器和排序。
QueryBuilder::for(Job::class)
->allowedFilters([
// your filters go here
])
->allowedSorts([
// your sorts go here
])
->tap(function ($query) use ($searchIds) {
return empty($searchIds) ? $query : $query->whereIn('id', $searchIds);
})
->paginate();在上面的示例中,我们使用tap方法对whereIn查询生成器方法进行条件链。这是一种更聪明的方法,可以更清晰地编写查询,但它相当于编写QueryBuilder::for(Job::class)->whereIn('id', $searchIds)。当没有搜索时,它将简单地省略whereIn方法。
这将限制您的QueryBuilder仅限于匹配您的搜索结果,并且您可以将所有的分类和筛选应用到这些结果。
https://stackoverflow.com/questions/65629180
复制相似问题