flowcontrol / query-filters
Eloquent 模型的查询过滤器
1.0.0
2017-01-03 18:15 UTC
Requires
- php: >=5.5.9
- laravel/framework: >=5.2
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);
}