flowcontrol/query-filters

Eloquent 模型的查询过滤器

1.0.0 2017-01-03 18:15 UTC

This package is auto-updated.

Last update: 2024-09-14 19:58:34 UTC


README

灵感来自Laracasts和Jeffrey Way - https://github.com/laracasts/Dedicated-Query-String-Filtering/

使用Composer安装

composer require flowcontrol/query-filters

然后添加ServiceProvider - FlowControl\QueryFilters\QueryFiltersServiceProvider::class

用法

定义一个QueryFilter类(你可以运行php artisan flowcontrol:query-filter filterName命令来生成脚手架)

<?php

namespace App\QueryFilters;

use Illuminate\Database\Eloquent\Builder;
use FlowControl\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);
    }
}

让模型使用FlowControl\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排序

默认情况下,基础Filter类将处理主表的排序。如果你有一个使用与模型相关联的列的ListView,你必须自己处理那个列。让我们假设你有一个User模型,它有一个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);
}