请阅读 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. 深入理解Java类加载器(ClassLoader) (转)

    转自: http://blog.csdn.net/javazejian/article/details/73413292 关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Ja ...

  2. 快速删除docker中的容器

    http://blog.csdn.net/cmzsteven/article/details/49230363

  3. SE Springer小组《Spring音乐播放器》可行性研究报告一、二

    1 引言 1.1编写目的 <软件工程>课程,我们团队计划开发一个音乐播放器.本文档是基于网络上现有的音乐播放器的特点,团队计划实现的音乐播放器功能和团队人员的综合实力等情况,说明该软件开发 ...

  4. react +MUI checkbox使用

    PS:因项目采用MUI,故,在此所讲的checkbox组件为MUI里的checkbox 因checkbox组件里 oncheck函数没法判断复选框是否选中,故,若直接复用且通过state改变check ...

  5. Current request is not a multipart request

    1. 文件上传需要在form表单中添加<form enctype="multipart/form-data"> 2. SpringMVC默认是关闭fileupload功 ...

  6. 网页访问过程(基于CDN)

    1. 全局负载均衡(基于DNS) 如果有多台 WEB 服务器同时为一个域名提供服务时,即一条 URL 对应多个 IP 地址,那么该 URL 的权威域名服务器可能会根据该 URL 解析出多个 IP 地址 ...

  7. Linux 压缩 解压缩 命令相关

    1.命令格式:tar[必要参数][选择参数][文件] 2.命令功能:用来压缩和解压文件.tar本身不具有压缩功能.他是调用压缩功能实现的 3.命令参数:必要参数有如下:-A 新增压缩文件到已存在的压缩 ...

  8. mysql索引利弊分析

    转载自:http://blog.csdn.net/linminqin/article/details/44342205  索引的利弊与如何判定,是否需要索引 相信读者都知道索引能够极大地提高数据检索的 ...

  9. rhel和centos7下更改网卡名称ens33为eth0

    Linux使用小Tips 整理些Linux些常遇到的问题. 修改网卡ens33为eth0 在使用RHEL和Centos7,发现网卡名称变成了EnoX,挺不习惯.现更改回旧名称eth0看着顺眼. 备份/ ...

  10. Java中split的对象被特殊字符(.或|)分隔

    在Java中,一个String对象被一些特殊字符分隔时,可以使用split()方法,生成一个String[],然后进行其他的操作,就像下面这样: String str = "a1_b1_c1 ...