administrcms / query-filters
此包最新版本(0.1.6)没有可用的许可证信息。
Eloquent 模型的查询过滤器
0.1.6
2019-10-25 06:09 UTC
Requires
- php: >=5.5.9
- laravel/framework: >=5.2
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); }