列过滤器

这个功能可以给表格的列设置一个过滤器,可以更方便的根据这一列进行数据表格过滤操作

列过滤器 - 图1

字符串比较查询

  1. use Dcat\Admin\Grid;
  2. // WHERE `username` = "$input"
  3. $grid->username->filter(
  4. Grid\Column\Filter\Equal::make()
  5. );

上面的调用可以给 username 这一列的头部加上一个 input 类型的过滤器,点击过滤器图标展开过滤器,输入查询提交后,会对这一列执行 等于 查询。

开启字段值查询

这个功能可以给每一列字段的值设置一个过滤器,点击该列字段的值就可以进行数据表格过滤操作,非常方便。

{tip} 开启此功能之后会把这个字段的原始值作为搜索内容,不会受 display 方法影响。

  1. use Dcat\Admin\Grid;
  2. // 设置为 label 或调用 display 方法不会影响查询内容
  3. $grid->ip->label()->filter();
  4. // 相当于
  5. $grid->ip->filter(
  6. Grid\Column\Filter\Equal::make()->valueFilter()
  7. );

鼠标移动到开启了值查询功能的列上面,右边会显示一个“放大镜”图标 列过滤器 - 图2

点击列之后,表头会出现“重置”按钮,点击可以取消筛选

列过滤器 - 图3

设置值的字段名称

如果当前列的值并非用户想要搜索的值,可以通过以下方法更改字段名称。

  1. $grid->model()->with('user');
  2. // 实际搜索的会是 name 字段的值
  3. $grid->username->filter('name');
  4. // 二维数组
  5. $grid->user_id->filter('user.id');
  6. // 闭包
  7. $grid->user_id->filter(function () {
  8. return $this->user['id'];
  9. });

隐藏表头的筛选器图标

  1. use Dcat\Admin\Grid;
  2. $grid->user_id->filterByValue();
  3. // 相当于
  4. $grid->user_id->filter(
  5. Grid\Column\Filter\Equal::make()
  6. ->valueFilter()
  7. ->hide()
  8. );

效果如下

列过滤器 - 图4

其余Input表单类型过滤器

  1. use Dcat\Admin\Grid;
  2. // WHERE `username` LIKE "%{$input}%"
  3. $grid->username->filter(
  4. Grid\Column\Filter\Like::make()
  5. );
  6. // WHERE `username` LIKE "{$input}%"
  7. $grid->username->filter(
  8. Grid\Column\Filter\StartWith::make()
  9. );
  10. // WHERE `username` > "$input"
  11. $grid->username->filter(
  12. Grid\Column\Filter\Gt::make()
  13. );
  14. // WHERE `username` <= "$input"
  15. $grid->username->filter(
  16. Grid\Column\Filter\Ngt::make()
  17. );
  18. // WHERE `username` < "$input"
  19. $grid->username->filter(
  20. Grid\Column\Filter\Lt::make()
  21. );
  22. // WHERE `username` >= "$input"
  23. $grid->username->filter(
  24. Grid\Column\Filter\Nlt::make()
  25. );

时间日期

如果字段是时间、日期相关的字段,可以使用下面的方法

  1. use Dcat\Admin\Grid;
  2. $grid->date()->filter(
  3. Grid\Column\Filter\Equal::make()->date()
  4. );
  5. $grid->time()->filter(
  6. Grid\Column\Filter\Like::make()->time()
  7. );
  8. $grid->datetime()->filter(
  9. Grid\Column\Filter\Gt::make()->datetime('YYYY-MM-DD HH:mm:ss')
  10. );

列过滤器 - 图5

多选查询

假设需要在表格数据中通过 status 字段过滤一个或者多个状态的数据,使用多选过滤可以非常方便的实现

  1. use Dcat\Admin\Grid;
  2. $grid->column('status', '状态')->filter(
  3. Grid\Column\Filter\In::make([
  4. 0 => '未知',
  5. 1 => '已下单',
  6. 2 => '已付款',
  7. 3 => '已取消',
  8. ])
  9. );

范围查询

假设需要通过 price 字段过滤出某个价格范围内的数据

  1. $grid->column('price')->filter(
  2. Grid\Column\Filter\Between::make()
  3. );

或者是时间、日期范围的过滤

  1. use Dcat\Admin\Grid;
  2. $grid->date()->filter(
  3. Grid\Column\Filter\Between::make()->date()
  4. );
  5. $grid->time()->filter(
  6. Grid\Column\Filter\Between::make()->time()
  7. );
  8. $grid->datetime()->filter(
  9. Grid\Column\Filter\Between::make()->datetime()
  10. );

指定查询字段名

通过setColumnName方法可以指定查询字段的名称

  1. $grid->column('column')->filter(
  2. Grid\Column\Filter\Equal::make()->setColumnName('custom_column')
  3. );

查询json字段

{tip} Since v1.7.0

  1. $grid->column('column')->filter(
  2. Grid\Column\Filter\Equal::make()->setColumnName('json_column->label')
  3. );

关联关系字段查询

{tip} Since v1.7.0

如果安装了 dcat/laravel-wherehasin,则会优先使用whereHasIn方法进行查询操作

  1. $grid->column('user.name')->filter(
  2. Grid\Column\Filter\Equal::make()
  3. );
  4. $grid->column('user_name')->filter(
  5. Grid\Column\Filter\Equal::make()->setColumnName('user.name')
  6. );