administrcms/query-filters

此包最新版本(0.1.6)没有可用的许可证信息。

Eloquent 模型的查询过滤器

0.1.6 2019-10-25 06:09 UTC

This package is auto-updated.

Last update: 2024-09-13 02:49:27 UTC


README

受 Laracasts 和 Jeffrey Way 的启发 - https://github.com/laracasts/Dedicated-Query-String-Filtering/

使用 Composer 安装

composer require administrcms/query-filters

并添加 ServiceProvider - Administr\QueryFilters\QueryFiltersServiceProvider::class

用法

定义一个查询过滤器类(您可以使用 php artisan administr:query-filter filterName 命令来生成脚手架)

<?php

namespace App\QueryFilters;

use Illuminate\Database\Eloquent\Builder;
use Administr\QueryFilters;

class LessonFilters extends Filter 
{
    /**
     * @param  string $order
     * @return Builder
     */
    public function popular($order = 'desc')
    {
        return $this->builder->orderBy('views', $order);
    }

    /**
     * @param  string $level
     * @return Builder
     */
    public function difficulty($level)
    {
        return $this->builder->where('difficulty', $level);
    }
}

使模型使用 Administr\QueryFilters\Filterable 特性。

最后,在您的控制器或需要运行此逻辑的地方

<?php

namespace App\Http\Controllers;

use App\Models\Lesson;
use App\QueryFilters\LessonFilters;

class LessonsController extends Controller
{
    public function index(LessonFilters $filters)
    {
        return Lesson::filter($filters)->get();
    }
}

ListView 排序

默认情况下,基本过滤器类将处理主表的排序。如果您有一个使用与模型相关联的列的 ListView,您必须自己处理该列。假设您有一个 User 模型,它与 UserType 有关系(一个用户有一个 UserType)。所以,在您的 ListView 中,您想按显示 UserType 名称的列进行排序。我们假设 ListView 中的列定义为 type.name。在这种情况下,您需要定义自定义排序如下

public function sortTypeName($dir)
{
    return $this
        ->builder
        ->join('user_types', 'user_types.id', '=', 'users.type_id')
        ->orderBy('user_types.id', $dir);
}