ahoysolutions/query-filters

一个基于查询字符串过滤数据库查询的Laravel包。

v1.1.2 2017-07-31 19:14 UTC

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');
}

如果您有多个可排序字段,用户利用的最新字段将具有优先权。

致谢