ayman-els/laravel-filter-package

一个具有自定义过滤特性的Laravel包

v1.0.0 2023-08-15 13:19 UTC

This package is auto-updated.

Last update: 2024-09-16 11:23:27 UTC


README

轻松根据URL查询字符串参数过滤查询。

与Laravel 5.x 6.x 7.x 8.x 9.x 10.x 兼容.

目录

问题描述

你可能遇到过需要根据URL查询字符串中的参数过滤查询的情况。在开发逻辑后,你可能有这样的代码

$users = User::latest();

if(request('username')) {
    $users->where('username', request('username'));
}

if(request('age')) {
    $users->where('age', '>', request('age'));
}

if(request('email')) {
    $users->where('email', request('email'));
}

return $users->get();

这可以工作,但这不是一个好的实践。

当参数的数量开始增加时,这种if语句的数量也会增加,你的代码会变得庞大且难以维护。

这也违反了SOLID原则中的开闭原则,因为当你有一个新参数时,你需要进入你的现有代码并添加新的逻辑(这可能会破坏现有的实现)。

因此,我们需要设计一种方法来使我们的过滤器逻辑相互分离,并应用于最终查询,这正是这个包背后的全部思想。

使用方法

  1. 首先,你需要安装这个包

$ composer require ayman-els/laravel-filter-package

  1. 然后,你应该在模型中use Filter 特性,并定义 $filterCols, $filterDates, $filterSearchCols, $filterColsChilds 属性。
use AymanEls\LaravelFilterPackage\Traits\Filter;

class Product extends Model
{
    use Filter;

    public static $filterCols = ['category_id', 'department_id', 'user_id'];
    public static $filterDates = ['from' => 'created_at', 'to' => 'created_at'];
    public static $filterSearchCols = ['name_en', 'name_ar', 'description'];
    public static $filterColsChilds = ['currency' => 'department'];

    ...
}
  1. 你需要在Eloquent查询中使用 filter() 方法。例如
Product::filter()->get();

假设我们的查询是这样的

?search=field&from=2023-01-01&to=2023-01-02&category_id=1&department_id=1&user_id=1&currency=1