数据查询过滤

model-grid提供了一系列的方法实现表格数据的查询过滤:

  1. $grid->filter(function($filter){
  2. // 去掉默认的id过滤器
  3. $filter->disableIdFilter();
  4. // 自定义id过滤器,在去掉默认id过滤器后必须调用 setId 方法,
  5. // 并设置一个和主键不同的值,自定义的id过滤器才会显示。
  6. $filter->equal('id', '产品序列号')->setId('product_id');
  7. // 在这里添加字段过滤器
  8. $filter->like('name', 'name');
  9. ...
  10. });

查询类型

目前支持的过滤类型有下面这些:

equal

sql: ... WHEREcolumn= "$input"

  1. $filter->equal('column', $label);

not equal

sql: ... WHEREcolumn!= "$input"

  1. $filter->notEqual('column', $label);

like

sql: ... WHEREcolumnLIKE "%$input%"

  1. $filter->like('column', $label);

ilike

sql: ... WHEREcolumnILIKE "%$input%"

  1. $filter->ilike('column', $label);

大于

sql: ... WHEREcolumn> "$input"

  1. $filter->gt('column', $label);

小于

sql: ... WHEREcolumn< "$input"

  1. $filter->lt('column', $label);

between

sql: ... WHEREcolumnBETWEEN "$start" AND "$end"

  1. $filter->between('column', $label);
  2. // 设置datetime类型
  3. $filter->between('column', $label)->datetime();
  4. // 设置time类型
  5. $filter->between('column', $label)->time();

in

sql: ... WHEREcolumnin (...$inputs)

  1. $filter->in('column', $label)->multipleSelect(['key' => 'value']);

notIn

sql: ... WHEREcolumnnot in (...$inputs)

  1. $filter->notIn('column', $label)->multipleSelect(['key' => 'value']);

date

sql: ... WHERE DATE(column) = "$input"

  1. $filter->date('column', $label);

day

sql: ... WHERE DAY(column) = "$input"

  1. $filter->day('column', $label);

month

sql: ... WHERE MONTH(column) = "$input"

  1. $filter->month('column', $label);

year

sql: ... WHERE YEAR(column) = "$input"

  1. $filter->year('column', $label);

where

可以用where来构建比较复杂的查询过滤

sql: ... WHEREtitleLIKE "%$input" ORcontentLIKE "%$input"

  1. $filter->where(function ($query) {
  2. $query->where('title', 'like', "%{$this->input}%")
  3. ->orWhere('content', 'like', "%{$this->input}%");
  4. }, 'Text');

sql: ... WHERErate>= 6 ANDcreated_at= {$input}:

  1. $filter->where(function ($query) {
  2. $query->whereRaw("`rate` >= 6 AND `created_at` = {$this->input}");
  3. }, 'Text');

关系查询,查询对应关系profile的字段:

  1. $filter->where(function ($query) {
  2. $query->whereHas('profile', function ($query) {
  3. $query->where('address', 'like', "%{$this->input}%")->orWhere('email', 'like', "%{$this->input}%");
  4. });
  5. }, '地址或手机号');

表单类型

text

表单类型默认是text input,可以设置placeholder:

  1. $filter->equal('column')->placeholder('请输入。。。');

也可以通过下面的一些方法来限制用户输入格式:

  1. $filter->equal('column')->url();
  2. $filter->equal('column')->email();
  3. $filter->equal('column')->integer();
  4. $filter->equal('column')->ip();
  5. $filter->equal('column')->mac();
  6. $filter->equal('column')->mobile();
  7. // $options 参考 https://github.com/RobinHerbots/Inputmask/blob/4.x/README_numeric.md
  8. $filter->equal('column')->decimal($options = []);
  9. // $options 参考 https://github.com/RobinHerbots/Inputmask/blob/4.x/README_numeric.md
  10. $filter->equal('column')->currency($options = []);
  11. // $options 参考 https://github.com/RobinHerbots/Inputmask/blob/4.x/README_numeric.md
  12. $filter->equal('column')->percentage($options = []);
  13. // $options 参考 https://github.com/RobinHerbots/Inputmask, $icon为input前面的图标
  14. $filter->equal('column')->inputmask($options = [], $icon = 'pencil');

select

  1. $filter->equal('column')->select(['key' => 'value'...]);
  2. // 或者从api获取数据,api的格式参考model-form的select组件
  3. $filter->equal('column')->select('api/users');

multipleSelect

一般用来配合innotIn两个需要查询数组的查询类型使用,也可以在where类型的查询中使用:

  1. $filter->in('column')->multipleSelect(['key' => 'value'...]);
  2. // 或者从api获取数据,api的格式参考model-form的multipleSelect组件
  3. $filter->in('column')->multipleSelect('api/users');

radio

比较常见的场景是选择分类

  1. $filter->equal('released')->radio([
  2. '' => 'All',
  3. 0 => 'Unreleased',
  4. 1 => 'Released',
  5. ]);

checkbox

比较常见的场景是配合whereIn来做范围筛选

  1. $filter->in('gender')->checkbox([
  2. 'm' => 'Male',
  3. 'f' => 'Female',
  4. ]);

datetime

通过日期时间组件来查询,$options的参数和值参考bootstrap-datetimepicker

  1. $filter->equal('column')->datetime($options);
  2. // `date()` 相当于 `datetime(['format' => 'YYYY-MM-DD'])`
  3. $filter->equal('column')->date();
  4. // `time()` 相当于 `datetime(['format' => 'HH:mm:ss'])`
  5. $filter->equal('column')->time();
  6. // `day()` 相当于 `datetime(['format' => 'DD'])`
  7. $filter->equal('column')->day();
  8. // `month()` 相当于 `datetime(['format' => 'MM'])`
  9. $filter->equal('column')->month();
  10. // `year()` 相当于 `datetime(['format' => 'YYYY'])`
  11. $filter->equal('column')->year();