请阅读 https://github.com/Tucker-Eric/EloquentFilter , 里面有很全的文档和注释,以下仅列出关键部分。

1. 安装

composer require tucker-eric/eloquentfilter

  

2. 添加Provider

在 config/app.php 中添加  EloquentFilter\ServiceProvider::class

'providers' => [
// Other service providers... EloquentFilter\ServiceProvider::class,
],

  

3. 添加配置

php artisan vendor:publish --provider="EloquentFilter\ServiceProvider"

  在 config 下出现 eloquentfilter.php 。

注意配置文件中 命名空间配置

'namespace' => "App\\ModelFilters\\",

  默认会读取该命名空间下类,若使用其他命名空间类,需要修改该配置,或者传入该类 。

//使用默认命名空间 
Post::filter(['title'=>'23'])->get();
//指定类
$userFilter = App\ModelFilters\User\UserFilter::class;
User::filter($input, $userFilter)->get();

  ,或者在Model 中指定(下面会提到)。

4. 修改Model

以User 为例

namespace App;

//必须引入
use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Model; class User extends Model
{
  //使用Trait , 其中有 scopeFilter, 以便可以静态调用, User::filter
use Filterable;

  //指定使用的过滤类
public function modelFilter()
{
return $this->provideFilter(App\ModelFilters\User\UserFilter::class);
} //User Class
}

  

5. 使用

5.1 动态过滤

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\User;
use App\ModelFilters\Admin\UserFilter as AdminFilter;
use App\ModelFilters\User\UserFilter as BasicUserFilter;
// 若没有添加alias , 参考 github 上文档会找不到类
use Illuminate\Support\Facades\Auth; class UserController extends Controller
{
public function index(Request $request)
{
$userFilter = Auth::user()->isAdmin() ? AdminFilter::class : BasicUserFilter::class; return User::filter($request->all(), $userFilter)->get();
}
}

  

文档中提高了很多功能和配置,这里不再复述,有不对的地方请指正!

补充:

1. User 表结构

CREATE TABLE `users`  (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`remember_token` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`created_at` timestamp(0) NULL DEFAULT NULL,
`updated_at` timestamp(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Compact;

2. Filterable 源码

trait Filterable
{ /**
* Creates local scope to run the filter.
*
* @param $query
* @param array $input
* @param null|string|ModelFilter $filter
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeFilter($query, array $input = [], $filter = null)
{
// Resolve the current Model's filter
if ($filter === null) {
$filter = $this->getModelFilterClass();
} // Create the model filter instance
$modelFilter = new $filter($query, $input); // Set the input that was used in the filter (this will exclude empty strings)
$this->filtered = $modelFilter->input(); // Return the filter query
return $modelFilter->handle();
}
}

  

 

3.  UserFilter 代码

use EloquentFilter\ModelFilter;

class UserFilter extends ModelFilter {
  /**
   * 关联查询中使用
* Related Models that have ModelFilters as well as the method on the ModelFilter
* As [relationMethod => [input_key1, input_key2]].
* 具有ModelFilters的相关模型以及ModelFilter上的方法 如[relationMethod => [input_key1,input_key2]]。
    * @var array
*/
public $relations = [];
  // 黑名单
// 过滤器不会调用blackist数组中定义的任何方法。这些方法通常用于内部过滤器逻辑
  protected $blacklist = ['secretMethod'];

  /**

  *  过滤是以表字段-方法,做了映射,
  */
// User 表中字段 email
public function email($email)
{
return $this->where('email', '=', $email);
}
  // User 表中字段
public function name($name)
{
return $this->where(function($q) use ($name)
{
return $q->where('name', 'LIKE', "%$name%");
});
}
// User 表中字段名
public function phone($phone)
{
return $this->where('phone', 'LIKE', "%$phone%");
}
  //每次filter,都会调用,非必需(参考 ModelFilter->filter )
public function setup()
{
$this->onlyShowDeletedForAdmins();
     //$this->xxx();
} public function onlyShowDeletedForAdmins()
{
if(Auth::user()->isAdmin())
{
//$this->withTrashed();
}
}
   //
public function secretMethod($secretParameter)
{
return $this->where('some_column', true);
}

4.  父类  EloquentFilter\ModelFilter

use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Database\Eloquent\Builder as QueryBuilder; /**
* @mixin QueryBuilder
*/
abstract class ModelFilter
{ /**
* ModelFilter constructor.
*
* @param $query
* @param array $input
* @param bool $relationsEnabled
*/
public function __construct($query, array $input = [], $relationsEnabled = true)
{
$this->query = $query;
$this->input = $this->removeEmptyInput($input);
$this->relationsEnabled = $relationsEnabled;
$this->registerMacros();
} /**
* @param $method
* @param $args
* @return mixed
*/
public function __call($method, $args)
{
$resp = call_user_func_array([$this->query, $method], $args); // Only return $this if query builder is returned
// We don't want to make actions to the builder unreachable
return $resp instanceof QueryBuilder ? $this : $resp;
} /**
* Handle all filters.
*
* @return QueryBuilder
*/
public function handle()
{
// Filter global methods
if (method_exists($this, 'setup')) {
$this->setup();
} // Run input filters
$this->filterInput();
// Set up all the whereHas and joins constraints
$this->filterRelations(); return $this->query;
} }

  

Eloquent 条件查询——tucker-eric/eloquentfilter 笔记的更多相关文章

  1. Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

    在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题? 解决方案一,按照Object[]数据取出数据,然后自己组bean 解决方 ...

  2. 【JAVAWEB学习笔记】21_多条件查询、attr和prop的区别和分页的实现

    今天主要学习了数据库的多条件查询.attr和prop的区别和分页的实现 一.实现多条件查询 public List<Product> findProductListByCondition( ...

  3. Sql学习笔记(二)—— 条件查询

    上篇简单介绍了一下sql的一些基础增删改查语句,而针对多种多样的查询语句则未详细说明,这一篇继续记录一下关于各种条件查询的知识. 1.按列名进行查询 语句: select stuName , stuA ...

  4. 【Oracle】曾经的Oracle学习笔记(4-7)多表联合查询,子查询,动态条件查询

    一.多表联合查询 二.子查询 三.动态条件查询 LESSON 4 Displaying Data from Multiple Tables------------------------------- ...

  5. Mysql学习笔记(004)- 条件查询

    条件查询 #进阶2:条件查询 /* 语法: select 查询列表③ from 表名① where 条件筛选② 分类: 一.按条件表达式筛选 条件运算符:> < = != <> ...

  6. MongoDB入门---文档查询操作之条件查询&and查询&or查询

    经过前几天的学习之路,今天终于到了重头戏了.那就是文档查询操作.话不多说哈,直接看下语法: db.collection.find(query, projection) query :可选,使用查询操作 ...

  7. jqGrid jqGrid分页参数+条件查询

    HTML <div class="row"> <div class="col-sm-20"> <form id="for ...

  8. Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)

    为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...

  9. Oracle学习总结_day03_day04_条件查询_排序_函数_子查询

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! day03_条件查询_排序_函数 清空回收站: PUR ...

随机推荐

  1. vim 多个文件切换 :b 命令

    MiniBufExplorer插件的使用 博客分类: vim vimMiniBufExplorer 快速浏览和操作Buffer -- 插件: MiniBufExplorer 下载地址 [http:// ...

  2. Node.js中module文件定义的top-level变量为何是私有的

    在Node.js中,module文件里面使用var,const或者let定义的top-level变量为何是私有的,只能在这个模块文件中使用呢? 原因就是,在模块文件中的内容执行之前,node.js会降 ...

  3. 互评Beta版本——杨老师粉丝群——Pinball

    互评beta版本    杨老师粉丝群——<PinBall> 一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 随着年龄的增长, ...

  4. 项目冲刺Beta第三篇博客

    Beta版本冲刺计划安排 1.当天站立式会议照片: 2.工作分工: 团队成员 分工 张洪滨060  排行榜界面美化 陈敬轩059  注册成功界面美化 黄兴067  登录界面美化 林国梽068  答题界 ...

  5. 个人作业-Week 2

    一.代码复审 概要部分 代码能符合需求和规格说明么? 能: 代码设计是否有周全的考虑? 有较为周全的考虑: 代码可读性如何? 可读性一般: 代码容易维护么? 不太容易维护: 代码的每一行都执行并检查过 ...

  6. Gulp插件笔记

    初次接触Gulp是出于网页模块化的需要,用过之后发现这个任务管理工具有很多实用的插件,意外地好用,于是打算写下这篇笔记把用到的Gulp插件记录一下.至于想了解Gulp基本用法的同学可以去Gulp官网查 ...

  7. 个人作业-week2(代码复审)

    一.代码复审check list 概要部分 代码符合需求和规格说明吗? 符合要求和规格说明,-s指令和-c指令都能实现需求.并且能够处理非法输入. 代码设计是否有周全的考虑? 程序的main函数中对各 ...

  8. Linux 下安装mysql 8.0.11(CentOS 7.4 系统)

    CentOS 7 自带MariaDB (前mysql开发工程师开发的,因此与吗,mysql 有很多相似之处) 1.检查卸载自带的MariaDB rpm -qa|grep mariadb //查询出来已 ...

  9. [转帖]技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解

    技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解    http://www.52im.net/thread-1309-1-1.html   本文来自腾讯资深研发工程师罗成的技术分享, ...

  10. ACM数论之旅1---素数(万事开头难(>_<))

    前言:好多学ACM的人都在问我数论的知识(其实我本人分不清数学和数论有什么区别,反正以后有关数学的知识我都扔进数论分类里面好了) 于是我就准备写一个长篇集,把我知道的数论知识和ACM模板都发上来(而且 ...