ahoysolutions / query-filters
一个基于查询字符串过滤数据库查询的Laravel包。
v1.1.2
2017-07-31 19:14 UTC
Requires
- php: ~7.0
- illuminate/console: ^5.4
- illuminate/database: ^5.4
- illuminate/http: ^5.4
- illuminate/support: ^5.4
Requires (Dev)
- fzaninotto/faker: ~1.4
- mockery/mockery: 0.9.*
- phpunit/phpunit: ~5.7
This package is not auto-updated.
Last update: 2024-09-23 07:21:32 UTC
README
安装
步骤1:Composer
从命令行运行
composer require ahoysolutions/query-filters
步骤2:服务提供者
在您的Laravel应用中,打开config/app.php
文件,并在providers
数组中添加
AhoySolutions\QueryFilters\QueryFilterServiceProvider::class
这将为您将包引导到Laravel中。
使用方法
将过滤器类添加到模型中
您可以通过Artisan命令添加过滤器类,就像控制器、模型或其他类似资源一样。例如,假设您想在Post模型上使用过滤器,您可以这样做
php artisan make:queryfilters PostFilters
之后,一个新的查询过滤器类将添加到您的app/Filters/
目录中。
添加过滤器方法
要向过滤器类添加过滤器方法,只需在类中添加一个函数即可。例如,假设您有一个查询字符串看起来像这样的传入请求:www.example.com/posts?user=johnsmith&popular
。
您的过滤器类可能如下所示
<?php
namespace App\Filters;
use AhoySolutions\QueryFilters\QueryFilters;
use App\User;
class PostFilters extends QueryFilters
{
/**
* Filter the posts by the given user.
*
* @param string $username
* @return \Illuminate\Database\Eloquent\Builder
*/
protected function filterUser(string $username)
{
$user = User::where('username', $username)->firstOrFail();
return $this->builder->where('artist_id', $user->id);
}
/**
* Filter the posts by their popularity.
*
* @return \Illuminate\Database\Eloquent\Builder
*/
protected function filterPopular()
{
$this->resetOrderBy();
return $this->builder->withCount('favorites')->orderBy('favorites_count', 'desc');
}
}
对查询字符串数组进行过滤
假设您的用户想根据不同的标签进行搜索,例如
// given url: /posts?tag[]=science&tag[]=music
/**
* Filter the posts by a given tag.
*
* @param string $tag
* @return \Illuminate\Database\Eloquent\Builder
*/
protected function filterTag(string $tag)
{
return $this->builder->whereHas('tags', function ($query) use ($tag) {
return $query->where('name', $tag);
});;
}
如您所见,您不需要在过滤器内部做任何事情就可以让用户利用这个功能。
相关的查询过滤器将被多次调用,并对每个标签应用过滤器。这对于检查多对多关系很有用。
添加可排序的方法
您可以通过在利用构建器之前调用$this->resetOrderBy()
来指定一个字段应该是可排序的,例如
// given url: /resource?popular
/**
* Sorts the posts by their popularity.
*
* @return \Illuminate\Database\Eloquent\Builder
*/
protected function filterPopular()
{
$this->resetOrderBy();
return $this->builder->withCount('favorites')->orderBy('favorites_count', 'desc');
}
如果您有多个可排序字段,用户利用的最新字段将具有优先权。