hamidreza-mozhdeh/filter-by-query-string

本软件包最新版本(v1.0.3)没有提供许可证信息。

通过URL查询字符串和Eloqunet的作用域过滤Laravel Eloquent的结果。

v1.0.3 2023-12-15 15:22 UTC

This package is auto-updated.

Last update: 2024-09-03 22:48:57 UTC


README

如果你喜欢它,请给它一个星标。

关于通过查询字符串过滤

使用此软件包,您可以通过使用URL查询字符串简单地使用Eloquent作用域来过滤模型结果。此存储库的优势在于您可以在业务逻辑(控制器、服务等)中重用您的本地作用域。

  • 它是安全的
  • 可重用本地作用域
  • 易于实现
  • 可定制

如何安装

运行composer require hamidreza-mozhdeh/filter-by-query-string。它将为您的项目添加一个FilterByQueryString特质。

如何使用

  • 将特质添加到您的模型中use FilterByQueryString;

分类模型

  class Category extends Model
  {
    use CategoryScopesTrait;
    use FilterByQueryString;
  }
  • 在控制器中简单地将表单请求传递到模型
    • 示例:$categories = Category::filter($request);
    • 请注意,您必须对Request类进行类型提示。
    • 重要:首先,最好为您的每个操作或方法(可选)提供一个表单请求。如果没有,您必须将requestMethod更改为input,这不建议。

分类控制器

class CategoryController extends Controller
{
    public function index(CategoryRequest $request)
    {
        return Category::filter($request)->get();
    }

分类请求

class CategoryRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'name' => ['sometimes', 'string', 'min:3', 'max:254'], // A single filter

            // Use Associative example
            'date-between' => ['sometimes', 'array'], // A filter with two values
            'date-between.from' => ['sometimes', 'date'], // Associative array
            'date-between.to' => ['sometimes', 'date'], // Associative array
             
            // Or Indexed example
            'date-between' => ['sometimes', 'array'], // A filter with two values
            'date-between.*' => ['sometimes', 'date'], // Indexed array
        ];
    }
}
  • 定义作用域以使用过滤器
    • 最好在某个位置创建模型目录和特质,例如App\Models\Traits\Scopes\CategoryScopesTrait

CategoryScopesTrait

trait CategoryScopesTrait
{
    public function scopeName(Builder $query, string $name): Builder
    {
        return $query->where('name', 'like', "%{$name}%");
    }

    public function scopeDateBetween(Builder $query, string $from, string $to): Builder
    {
        return $query->whereBetween('created_at', [$from, $to]);
    }
}
  • 例如,要过滤名称为"ossw"的分类,请使用
    http://0.0.0.0/api/categories?name=ossw
  • 要使用日期进行过滤,请使用
    索引数组:http://0.0.0.0/api/categories?date-between[]=2023-11-23&date-between[]=2023-11-25
    关联数组:http://0.0.0.0/api/categories?date-between[from]=2023-11-23&date-between[to]=2023-11-25

自定义

  $categories = Category::filter(
    request: $request,
    only: ['name'], // Only accept this filter.
    except: ['date-between'], // Do not accept the `date-between` method.
    prefix: 'filters', // Add `filters` as array prefix.
    requestMethod: 'input' // The default get method is validated but you can choose different one.
  );

使用前缀:http://0.0.0.0/api/categories?filters[name]=ossw