请阅读 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. 互评beta版本 - hello word!【空天猎】

    基于NABCD评论作品 1.Need需求:市面上同类型的手机及PC端飞行射击类游戏有很多,所以从需求方面来说,这款游戏的潜在客户非常有局限性.近些年较火的飞行射击类游戏,例如腾讯14年发行的<全 ...

  2. 小组冲刺第十一天站立会议(发布Alpha版+网站链接)

    注: “助成”招聘网站链接:http://58.87.74.131:8080/zhucheng 欢迎大家进行评测. 一.任务看板: 二.燃尽图: 三.团队成员合照: 四.任务总结: 今天我们发布网站B ...

  3. 第一阶段Spring个人总结

    通过这一阶段的冲刺,我感到的是名义上的团队,而实际上却是一个人的事,每个人跟每个人都不一样,都有自己的特点,总会出些不必要的麻烦. 还有团队的进展也是看不到什么东西,说实话,这次我并没有太多关注团队的 ...

  4. Maven教程--02设置Maven本地仓库|查看Maven中央仓库

    一:设置Maven本地仓库 Maven默认仓库的路径:~\.m2\repository,~表示我的个人文档:例如:C:\Users\Edward\.m2\repository:如下图: Maven的配 ...

  5. Hibernate left join

    6.4.5  左外连接 左外连接(Left Outer Join)查询出左表对应的复合条件的所有记录,如查询李晓梅同学的选课信息.下面是类HQLLeftOuterJoinQuery的源代码. 其实关联 ...

  6. 福大软工 · 第七次作业 - 需求分析报告(404 Note Found队)

    目录 组队后的团队项目的整体计划安排 项目logo及思维导图 项目logo 思维导图 产品思维导图 产品思维导图-引导 产品思维导图-后端数据处理.存储 产品思维导图-短信识别 产品思维导图-智能分析 ...

  7. 28_数据库_第28天(数据库、表及表数据、SQL语句)_讲义

    今日内容介绍 1.MySQL数据库 2.SQL语句 01数据库概念 A: 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来, 用户可以对数据库中的数据进行 ...

  8. Keil C51与Keil ARM共存

    转自:http://blog.chinaunix.net/uid-20734916-id-3988537.html Keil和MDK共存,按照以下步骤:1 先安装 Keil C51,安装目录改为:&q ...

  9. Teamcity部署.net服务“无法连接到远程服务器”解决方式

    在公司Teamcity上执行自动部署.net服务的时候,发现Teamcity在启动default.aspx的时候报错了,提示:使用“0”个参数调用“GetResponse”时发生异常:“无法连接到远程 ...

  10. [转帖] CentOS7 与 CentOS6的对比

    来源网站: http://blog.51cto.com/fengery/1901349 centos6.x_centos7.x差异改进明细 感谢原作者 centos官方帮助文档:https://wik ...