繁体   English   中英

Laravel Spatie Query Builder - 为过滤器创建 OR 条件

[英]Laravel Spatie Query Builder - create OR condition for filters

我正在使用 laravel spatie 过滤模型我在允许的过滤器数组中有以下过滤器

$this->allowedFilters = [
        'name',
        AllowedFilter::exact('company_id'),
        'location',
        'summary',
        'client_name',
    ];

当我提出要求时

past-projects?filter[company_id]=${companyId}&filter[name]=${search}&filter[summary]={company_id}

它使用 AND 条件搜索完全包含所有传递的搜索参数的数据,如果传递的任何参数不匹配,则不返回任何结果。 如果任何传递的参数匹配,我想得到结果。

任何帮助将不胜感激。

根据Spatie Laravel Query Builder 文档allowedFilters()方法将获取字符串数组并返回所有参数匹配的结果。

坏消息:因此,它不会像您打算使用的那样工作。

Spatie docs #Basic Usage 部分

你想要的是 Laravel 的Or Where 子句

Laravel 8 文档或 Where 子句

好消息:由于 Spatie Laravel 查询构建器扩展了 Laravel 的默认 Eloquent 查询构建器,您可以同时使用 Laravel 查询和 Spatie 查询。


假设您想从“Org ABC”中获取所有用户,并且您想从该结果中获取名称为“Jack”或位置为“USA”或客户端名称为“John”或摘要为“Hello World”的所有用户。 那你可以试试

$result = QueryBuilder::for(Projects::class)
          ->allowedFilters(['company_id']
          ->where(function ($query) use ($name, $location, ...)
                $query
                    ->where('projects.user.name', 'like', '%$title%')
                    ->orWhere('projects.location', 'like', '%$location%')
                    ->orWhere() ....
          );

return $result

我遇到了这个问题......这是我解决它的一种方法。 您也可以像这样在查询构建器中使用回调...

$users = QueryBuilder::for(User::class)
->allowedFilters([
'user_type',
'user_city',
AllowedFilter::exact('status')->default('new'),
AllowedFilter::callback('search', function($query, $value){
    $query->where('name', 'LIKE', '%' . $value . '%')
    ->orWhere('bio', 'LIKE', '%' . $value . '%')
    ->orWhere('state', 'LIKE', '%' . $value . '%')
    ->orWhere('address', 'LIKE', '%' . $value . '%');
})
])->get();

那么 URL 将如下所示

?filter[user_type]=customer&filter[search]=doe&filter[user_city]=boston

搜索参数将用于检查姓名、简历、状态和地址是否匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM