phatnt99/advanced-query

强大的查询功能,用于过滤、排序和自定义Eloquent查询。

v1.0 2020-11-15 05:59 UTC

This package is auto-updated.

Last update: 2024-09-15 14:33:52 UTC


README

此包为Eloquent Laravel提供高级查询功能。

要求

此包需要

  • PHP 7.2+

安装

通过composer安装此包

composer require phatnt99/advanced-query

Laravel

此包支持自动发现,因此如果您使用Laravel 5.5或更高版本,您可能可以跳过此步骤。

将以下行添加到 config/app.php 文件中的 providers 键以添加服务提供者

Phatnt99\AdvancedQuery\QueryServiceProvider::class

使用方法

此包支持3个主要功能: 过滤排序自定义查询

要开始使用,请运行以下Artisan命令

php artisan make:query UserQuery --fs

注意:您需要在此命令运行之前定义您的模型,查询中的User一词将用于查找现有模型。如果未提供名称对应的模型,则会显示错误并导致意外行为(但在此之后,您可以更改正确的类模型)。

--fs 选项将创建类Filter和Sort,如果您只自定义查询,则可以删除此选项。

上述命令将在 App\Queries 中创建3个文件

-Queries
|
--Filters
| |
| --UserFilter.php
| |
--Sorts
| |
| --UserSort.php
|
--UserQuery.php

详细说明

过滤

默认过滤

此包提供3个属性以节省您的时间。您不必这样做

return $query->where('name','LIKE', '%'.$name.'%');
...
return $query->where('email', '=', $email);
...
return $query->whereDate('created_at', '=', date('Y-m-d'));

您可以这样做

protected $filterPartial = [
	'name'
];

protected $filterExact = [
	'email'
];

protected $filterDate = [
	'created_at'
];

这减少了编写重复代码的时间,并使执行过滤功能的类更易于阅读 :)

范围日期过滤

关于日期过滤的小贴士,如果您想过滤日期范围(从...到),请尝试这样做

    protected $filterDate = [
        'from.created_at',
        'to.created_at'
    ];

自定义过滤

有时您的过滤器与复杂的逻辑(如根据关系属性进行过滤)一起工作,过滤器类可以帮助您自定义自己的函数来执行复杂的过滤。

protected function project($projectId)
{
	return $this->query->whereHas('projects', function ($query) use ($projectId) {
            $query->where('project_id', '=', $projectId);
        });
}

然后在查询字符串中使用函数名作为属性名。

在查询字符串中使用

您可以通过 filters 键传递要过滤的属性及其值

GET /users?filters[name]=John&filters[created_at]=2020-02-02

排序

默认排序

具体的Sort类有属性defaultSorts,您可以使用它来定义可排序的属性。

protected $defaultSorts = [
        'full_name',
        'nick_name',
        'dob',
        'email',
        'phone_number',
];

对于具有恒定方向的属性,使用enum SortDirection作为其值

protected $defaultSorts = [
		...
        'dob' => SortDirection::DESCENDING,
];

注意:如果属性同时具有默认方向(如上所示)和查询字符串中的方向,则将查询字符串中的方向视为优先级更高。

在查询字符串中使用

我使用带有前缀 - 的 sort 键来执行降序排序(无表示升序)

GET /users?sort=id,-dob

查询

这是绑定包主要功能的类。您必须定义一些指向依赖类的重要属性

/**
* Your model class
* @var string
*/
protected $model = User::class;

/**
* Your filter class
* @var string
*/
protected $filter = UserFilter::class;

/**
* Your sort class
* @var string
*/
protected $sort = UserSort::class;

如果您使用完整命令(带有--fs选项和正确的模型)将自动为您绑定这些值(如果不使用--fs选项,则仅绑定模型类)。

只需指定依赖类(在每个依赖项中提供完整处理程序)即可使用包的主要功能。

// UserController

public function index(UserQuery $query)
{
   return response()->json(
			$query->filter()
				->sort()
				->paginate());
}

允许的属性

如果您只想允许一些属性进行过滤或排序,请将这些属性传递给 allows 参数(第二个参数)

   return response()->json(
			$query->filter(null, ['id', 'name'])
				->sort(null, ['created_at'])
				->paginate());

Eloquent查询 & 高级查询

您可以直接使用Eloquent方法(where、whereHas...)与Query类实例一起使用,但会丢失链(链式方法)。更好的方法是定义自己的方法,使用这些Eloquent方法,然后返回Query实例

// UserQuery

/**
* Advanced Query
*/
public function verifiedUser() {
	$this->query->whereNotNull('email_verify_at');
	return $this;
}

分页

我使用了Eloquent模型默认的分页,允许您通过将期望页面的索引传递给 paginate()(默认为1)

其他用法

您可以单独使用每个功能。

过滤 & 排序独立

您必须设置查询属性以独立使用。示例(与排序相同的方法)

$filter = new \App\Queries\Filters\UserFilter();
$filter->setQuery(User::query());

而不是将属性(带有值)传递到查询字符串中,您可以将其传递到setAllowAttrs方法

$filter = new \App\Queries\Filters\UserFilter();
$filter->setQuery(User::query())
	   ->setAllowAttrs(['name' => 'John'])
	   ->getCollection();

然后您可以使用getCollection方法轻松地获取集合结果。

顺便说一下,该软件包为过滤和排序提供了2个单独的命令

php artisan make:filter UserFilter
php artisan make:sort UserSort

编码愉快!

贡献

如果您发现某些问题或想用您的代码让它变得更好,请随意提交PR或Issue :)

许可证

MIT许可证(MIT)