243 lines
5.4 KiB
Markdown
243 lines
5.4 KiB
Markdown
|
|
# 数据查询过滤
|
|||
|
|
|
|||
|
|
`model-grid`提供了一系列的方法实现表格数据的查询过滤:
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
$grid->filter(function($filter){
|
|||
|
|
|
|||
|
|
// 去掉默认的id过滤器
|
|||
|
|
$filter->disableIdFilter();
|
|||
|
|
|
|||
|
|
// 自定义id过滤器,在去掉默认id过滤器后必须调用 setId 方法,
|
|||
|
|
// 并设置一个和主键不同的值,自定义的id过滤器才会显示。
|
|||
|
|
$filter->equal('id', '产品序列号')->setId('product_id');
|
|||
|
|
|
|||
|
|
// 在这里添加字段过滤器
|
|||
|
|
$filter->like('name', 'name');
|
|||
|
|
...
|
|||
|
|
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
## 查询类型
|
|||
|
|
|
|||
|
|
目前支持的过滤类型有下面这些:
|
|||
|
|
|
|||
|
|
### equal
|
|||
|
|
`sql: ... WHERE `column` = "$input"`:
|
|||
|
|
```php
|
|||
|
|
$filter->equal('column', $label);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### not equal
|
|||
|
|
`sql: ... WHERE `column` != "$input"`:
|
|||
|
|
```php
|
|||
|
|
$filter->notEqual('column', $label);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### like
|
|||
|
|
`sql: ... WHERE `column` LIKE "%$input%"`:
|
|||
|
|
```php
|
|||
|
|
$filter->like('column', $label);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### ilike
|
|||
|
|
`sql: ... WHERE `column` ILIKE "%$input%"`:
|
|||
|
|
```php
|
|||
|
|
$filter->ilike('column', $label);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 大于
|
|||
|
|
`sql: ... WHERE `column` > "$input"`:
|
|||
|
|
```php
|
|||
|
|
$filter->gt('column', $label);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 小于
|
|||
|
|
`sql: ... WHERE `column` < "$input"`:
|
|||
|
|
```php
|
|||
|
|
$filter->lt('column', $label);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### between
|
|||
|
|
`sql: ... WHERE `column` BETWEEN "$start" AND "$end"`:
|
|||
|
|
```php
|
|||
|
|
$filter->between('column', $label);
|
|||
|
|
|
|||
|
|
// 设置datetime类型
|
|||
|
|
$filter->between('column', $label)->datetime();
|
|||
|
|
|
|||
|
|
// 设置time类型
|
|||
|
|
$filter->between('column', $label)->time();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### in
|
|||
|
|
`sql: ... WHERE `column` in (...$inputs)`:
|
|||
|
|
```php
|
|||
|
|
$filter->in('column', $label)->multipleSelect(['key' => 'value']);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### notIn
|
|||
|
|
`sql: ... WHERE `column` not in (...$inputs)`:
|
|||
|
|
```php
|
|||
|
|
$filter->notIn('column', $label)->multipleSelect(['key' => 'value']);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### date
|
|||
|
|
`sql: ... WHERE DATE(`column`) = "$input"`:
|
|||
|
|
```php
|
|||
|
|
$filter->date('column', $label);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### day
|
|||
|
|
`sql: ... WHERE DAY(`column`) = "$input"`:
|
|||
|
|
```php
|
|||
|
|
$filter->day('column', $label);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### month
|
|||
|
|
`sql: ... WHERE MONTH(`column`) = "$input"`:
|
|||
|
|
```php
|
|||
|
|
$filter->month('column', $label);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### year
|
|||
|
|
`sql: ... WHERE YEAR(`column`) = "$input"`:
|
|||
|
|
```php
|
|||
|
|
$filter->year('column', $label);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### where
|
|||
|
|
|
|||
|
|
可以用where来构建比较复杂的查询过滤
|
|||
|
|
|
|||
|
|
`sql: ... WHERE `title` LIKE "%$input" OR `content` LIKE "%$input"`:
|
|||
|
|
```php
|
|||
|
|
$filter->where(function ($query) {
|
|||
|
|
|
|||
|
|
$query->where('title', 'like', "%{$this->input}%")
|
|||
|
|
->orWhere('content', 'like', "%{$this->input}%");
|
|||
|
|
|
|||
|
|
}, 'Text');
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
`sql: ... WHERE `rate` >= 6 AND `created_at` = {$input}`:
|
|||
|
|
```php
|
|||
|
|
$filter->where(function ($query) {
|
|||
|
|
|
|||
|
|
$query->whereRaw("`rate` >= 6 AND `created_at` = {$this->input}");
|
|||
|
|
|
|||
|
|
}, 'Text');
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
关系查询,查询对应关系`profile`的字段:
|
|||
|
|
```php
|
|||
|
|
$filter->where(function ($query) {
|
|||
|
|
|
|||
|
|
$query->whereHas('profile', function ($query) {
|
|||
|
|
$query->where('address', 'like', "%{$this->input}%")->orWhere('email', 'like', "%{$this->input}%");
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
}, '地址或手机号');
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 表单类型
|
|||
|
|
|
|||
|
|
### text
|
|||
|
|
|
|||
|
|
表单类型默认是text input,可以设置placeholder:
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
$filter->equal('column')->placeholder('请输入。。。');
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
也可以通过下面的一些方法来限制用户输入格式:
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
$filter->equal('column')->url();
|
|||
|
|
|
|||
|
|
$filter->equal('column')->email();
|
|||
|
|
|
|||
|
|
$filter->equal('column')->integer();
|
|||
|
|
|
|||
|
|
$filter->equal('column')->ip();
|
|||
|
|
|
|||
|
|
$filter->equal('column')->mac();
|
|||
|
|
|
|||
|
|
$filter->equal('column')->mobile();
|
|||
|
|
|
|||
|
|
// $options 参考 https://github.com/RobinHerbots/Inputmask/blob/4.x/README_numeric.md
|
|||
|
|
$filter->equal('column')->decimal($options = []);
|
|||
|
|
|
|||
|
|
// $options 参考 https://github.com/RobinHerbots/Inputmask/blob/4.x/README_numeric.md
|
|||
|
|
$filter->equal('column')->currency($options = []);
|
|||
|
|
|
|||
|
|
// $options 参考 https://github.com/RobinHerbots/Inputmask/blob/4.x/README_numeric.md
|
|||
|
|
$filter->equal('column')->percentage($options = []);
|
|||
|
|
|
|||
|
|
// $options 参考 https://github.com/RobinHerbots/Inputmask, $icon为input前面的图标
|
|||
|
|
$filter->equal('column')->inputmask($options = [], $icon = 'pencil');
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### select
|
|||
|
|
```php
|
|||
|
|
$filter->equal('column')->select(['key' => 'value'...]);
|
|||
|
|
|
|||
|
|
// 或者从api获取数据,api的格式参考model-form的select组件
|
|||
|
|
$filter->equal('column')->select('api/users');
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### multipleSelect
|
|||
|
|
一般用来配合`in`和`notIn`两个需要查询数组的查询类型使用,也可以在`where`类型的查询中使用:
|
|||
|
|
```php
|
|||
|
|
$filter->in('column')->multipleSelect(['key' => 'value'...]);
|
|||
|
|
|
|||
|
|
// 或者从api获取数据,api的格式参考model-form的multipleSelect组件
|
|||
|
|
$filter->in('column')->multipleSelect('api/users');
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### radio
|
|||
|
|
比较常见的场景是选择分类
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
$filter->equal('released')->radio([
|
|||
|
|
'' => 'All',
|
|||
|
|
0 => 'Unreleased',
|
|||
|
|
1 => 'Released',
|
|||
|
|
]);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### checkbox
|
|||
|
|
比较常见的场景是配合`whereIn`来做范围筛选
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
$filter->in('gender')->checkbox([
|
|||
|
|
'm' => 'Male',
|
|||
|
|
'f' => 'Female',
|
|||
|
|
]);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### datetime
|
|||
|
|
|
|||
|
|
通过日期时间组件来查询,`$options`的参数和值参考[bootstrap-datetimepicker](http://eonasdan.github.io/bootstrap-datetimepicker/Options/)
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
$filter->equal('column')->datetime($options);
|
|||
|
|
|
|||
|
|
// `date()` 相当于 `datetime(['format' => 'YYYY-MM-DD'])`
|
|||
|
|
$filter->equal('column')->date();
|
|||
|
|
|
|||
|
|
// `time()` 相当于 `datetime(['format' => 'HH:mm:ss'])`
|
|||
|
|
$filter->equal('column')->time();
|
|||
|
|
|
|||
|
|
// `day()` 相当于 `datetime(['format' => 'DD'])`
|
|||
|
|
$filter->equal('column')->day();
|
|||
|
|
|
|||
|
|
// `month()` 相当于 `datetime(['format' => 'MM'])`
|
|||
|
|
$filter->equal('column')->month();
|
|||
|
|
|
|||
|
|
// `year()` 相当于 `datetime(['format' => 'YYYY'])`
|
|||
|
|
$filter->equal('column')->year();
|
|||
|
|
|
|||
|
|
```
|