dmarte / filterable
易于使用的包,用于过滤 Laravel Eloquent 记录。
v1.0.6
2021-07-28 16:06 UTC
Requires
- laravel/scout: ^8.6
README
一个 Laravel 库,用于处理 Eloquent 模型或 Scout 数据库记录的筛选,只需一个 API。
工作原理
Filterable 会自动执行所需实现以从 Eloquent 模型获取记录。首先,将尝试检查是否要执行 Laravel Scout 搜索或完整的 Eloquent 模型搜索。
它还支持全文搜索。
IMPORTANT NOTE:
Filterable will return a JsonResource if the HTTP Accept is present and is application/json.
实现
// IN YOUR ELOQUENT MODEL namespace App\Models; use Illuminate\Database\Eloquent\Model; use \Dmarte\Filterable\Filterable; class Contact extends Model { // Just, import the trait filterable use Filterable; }
// IN YOUR CONTROLLER use App\Models\Contact; use Illuminate\Support\Facades\Request; use Illuminate\Http\Resources\Json\JsonResource; use App\Http\Controllers\Controller; class ContactController extends Controller { public function index(Request $request) : JsonResource{ // Just call the static function "filter" to perform the query. return Contact::filter($request); } }
分页
默认情况下,Filterable 包将返回一个记录集合,如果您想要获取分页器格式,必须在请求中包含查询字符串 paginator=true
。
使用 ?paginator=false
响应将是
[]
使用 ?paginator=true
响应将是
{ "data": Array, "meta": { "per_page": Number "current_page": Number "last_page": Number "from": Number "to": Number } }
保留 查询字符串
参数
为了改变搜索中期望的结果,filterable 会检查您请求中的参数。
限制全文列检查
通过指定应全文可搜索的列的列表,可以基于通用标准进行全局搜索。
// IN YOUR MODEL // just override the method that indicate // the columns should be full-text filterable /** * @return array */ protected static function fullTextColumns(): array { return [ 'name', 'description', //... ]; }
可筛选查询
当您覆盖 filterableQueries
方法时,可以为每个列创建自己的逻辑。
重要
您必须确保为每个回调返回一个 Illuminate\Support\Collection
实例。filterable 引擎将检查集合上的 "key" 以匹配请求 "key",然后期望每个值都是一个执行您所需查询的回调函数。
以下是一个示例
// IN YOUR MODEL protected function filterableQueries(): Collection { return collect([ 'team_id' => fn(Builder $query, $column, $value) => $query->where($column, $value), 'emitted_at' => function (Builder $query, $column, $value) { if (is_array($value)) { return $query->whereBetween($column, $value); } return $query->where($column, $value); }, ]); }
资源响应
您可以使用 qualifiedResource
函数更改用作响应的资源类。使用这个 static
函数,您返回资源路径。
注意 默认情况下,它将采用模型名称并附加后缀
Resource
。例如,对于\App\Models\User
模型,将尝试找到\App\Http\Resources\UserResource
。
您可以通过覆盖该函数来更改此行为。
protected static function qualifiedResource(): string { return \App\Http\Resources\ModelResource::class; }
通过多个模型筛选
对于全局搜索,您可以使用多模型筛选器。
// Add column filter that will be applied to all models. $request->merge([ 'team_id' => $request->user()->team_id, ]); $engine = new FilterableMultiple( models: [ Service::class, Product::class, ], request: $request ); // Customize the query used for a given model $engine->query(Service::class, function (Builder $query) { $query->where('kind', 'service_custome_value'); }); // Return the collection return $engine->get()