首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用spatie/laravel-query-builder和teamtnt/laravel-驱动程序

使用spatie/laravel-query-builder和teamtnt/laravel-驱动程序
EN

Stack Overflow用户
提问于 2021-01-08 12:43:52
回答 1查看 943关注 0票数 0

我尝试将拉拉搜索空间查询生成器结合使用。基于Spatie文档,我尝试构建如下查询

代码语言:javascript
复制
        if($request->has('kw')) {
           $keyword = response()->json($request->get('kw'));
           $query = Job::search($keyword);
        } else {
            $query = new Job();
        }

        $result = QueryBuilder::for($query)
               ->paginate()
               ->query();

由于laravel搜索没有返回一个雄辩的对象,这个查询将失败。有办法将这两个包组合在一起吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-22 16:31:43

我完全按照您对TNTSearch驱动程序所做的做了,我得出了一个困难的结论: Scout根本不支持默认的QueryBuilder对象所做的广泛的查询处理。这是故意的。如果您阅读了Scout文档,就会清楚地表明,在应用所有通常需要的筛选/排序查询之前,必须执行搜索。因此,可以这样想:搜索>筛选,并对搜索结果进行排序。

话虽如此,实现你想要的是有可能的。它只需要两个查询,而不是一个查询。也许总有一天童子军会得到更好的支持。

我就是这样做的:

设置一个变量以保存搜索结果ids。

代码语言:javascript
复制
$searchIds = blank($request->kw) ? [] : Job::search($this->search)->keys();

searchIds现在要么是空数组,要么是模型ids的数组。现在,您可以利用斯帕蒂的QueryBuilder对象应用您的过滤器和排序。

代码语言:javascript
复制
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仅限于匹配您的搜索结果,并且您可以将所有的分类和筛选应用到这些结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65629180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档