查询过滤
<h1>查询过滤</h1>
<p><code>model-grid</code>提供了一系列的方法实现表格数据的查询过滤:</p>
<pre><code class="language-php">// 禁用
$grid-&gt;disableFilter();
// 显示
$grid-&gt;showFilter();
// 禁用过滤器按钮
$grid-&gt;disableFilterButton();
// 显示过滤器按钮
$grid-&gt;showFilterButton();
$grid-&gt;filter(function($filter){
// 展开过滤器
$filter-&gt;expand();
// 在这里添加字段过滤器
$filter-&gt;equal('id', '产品序列号');
$filter-&gt;like('name', 'name');
...
});</code></pre>
<h2>过滤器布局</h2>
<p>默认布局方式为<code>rightSide</code></p>
<h3>rightSide</h3>
<pre><code class="language-php">use Dcat\Admin\Grid;
$grid-&gt;filter(function (Grid\Filter $filter) {
// 更改为 rightSide 布局
$filter-&gt;rightSide();
...
});</code></pre>
<p>效果</p>
<p><img src="https://cdn.learnku.com/uploads/images/202004/26/38389/3g9EdvZTQA.png!large" alt="" /></p>
<h3>panel</h3>
<pre><code class="language-php">use Dcat\Admin\Grid;
$grid-&gt;filter(function (Grid\Filter $filter) {
// 更改为 panel 布局
$filter-&gt;panel();
// 注意切换为panel布局方式时需要重新调整表单字段的宽度
$filter-&gt;equal('id')-&gt;width(3);
});</code></pre>
<p>效果</p>
<p><img src="https://cdn.learnku.com/uploads/images/202004/26/38389/vkPFs0Hnil.png!large" alt="" /></p>
<h3>自定义布局 (view)</h3>
<p>如果以上的布局无法满足需求,可以通过<code>view</code>方法自定义过滤器模板</p>
<pre><code class="language-php">$grid-&gt;filter(function ($filter) {
$filter-&gt;view('xxx');
...
});</code></pre>
<p><a name="type"></a></p>
<h2>查询类型</h2>
<p>目前支持的过滤类型有下面这些:</p>
<p><a name="equal"></a></p>
<h3>equal</h3>
<p><code>sql: ... WHERE</code>column<code>= &quot;$input&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;equal('column', $label);</code></pre>
<p><a name="nequal"></a></p>
<h3>notEqual</h3>
<p><code>sql: ... WHERE</code>column<code>!= &quot;$input&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;notEqual('column', $label);</code></pre>
<p><a name="like"></a></p>
<h3>like</h3>
<p><code>sql: ... WHERE</code>column<code>LIKE &quot;%$input%&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;like('column', $label);</code></pre>
<h3>ilike</h3>
<p><code>sql: ... WHERE</code>column<code>ILIKE &quot;%$input%&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;ilike('column', $label);</code></pre>
<p><a name="startwith"></a></p>
<h3>startWith</h3>
<p><code>sql: ... WHERE</code>column<code>LIKE &quot;$input%&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;startWith('column', $label);
// 如果需要使用“ilike”
$filter-&gt;startWith('column', $label)-&gt;ilike();</code></pre>
<p><a name="endwith"></a></p>
<h3>endWith</h3>
<p><code>sql: ... WHERE</code>column<code>LIKE &quot;%$input&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;endWith('column', $label);
// 如果需要使用“ilike”
$filter-&gt;endWith('column', $label)-&gt;ilike();</code></pre>
<p><a name="gt"></a></p>
<h3>gt</h3>
<p><code>sql: ... WHERE</code>column<code>&gt; &quot;$input&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;gt('column', $label);</code></pre>
<p><a name="lt"></a></p>
<h3>lt</h3>
<p><code>sql: ... WHERE</code>column<code>&lt; &quot;$input&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;lt('column', $label);</code></pre>
<p><a name="ngt"></a></p>
<h3>ngt</h3>
<p><code>sql: ... WHERE</code>column<code>&lt;= &quot;$input&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;ngt('column', $label);</code></pre>
<p><a name="nlt"></a></p>
<h3>nlt</h3>
<p><code>sql: ... WHERE</code>column<code>&gt;= &quot;$input&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;nlt('column', $label);</code></pre>
<p><a name="between"></a></p>
<h3>between</h3>
<p><code>sql: ... WHERE</code>column<code>BETWEEN &quot;$start&quot; AND &quot;$end&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;between('column', $label);
// 设置datetime类型
$filter-&gt;between('column', $label)-&gt;datetime();
// 设置time类型
$filter-&gt;between('column', $label)-&gt;time();</code></pre>
<p><a name="in"></a></p>
<h3>in</h3>
<p><code>sql: ... WHERE</code>column<code>in (...$inputs)</code>:</p>
<pre><code class="language-php">$filter-&gt;in('column', $label)-&gt;multipleSelect(['key' =&gt; 'value']);</code></pre>
<p><a name="notIn"></a></p>
<h3>notIn</h3>
<p><code>sql: ... WHERE</code>column<code>not in (...$inputs)</code>:</p>
<pre><code class="language-php">$filter-&gt;notIn('column', $label)-&gt;multipleSelect(['key' =&gt; 'value']);</code></pre>
<p><a name="date"></a></p>
<h3>date</h3>
<p><code>sql: ... WHERE DATE(</code>column<code>) = &quot;$input&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;date('column', $label);</code></pre>
<p><a name="day"></a></p>
<h3>day</h3>
<p><code>sql: ... WHERE DAY(</code>column<code>) = &quot;$input&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;day('column', $label);</code></pre>
<p><a name="month"></a></p>
<h3>month</h3>
<p><code>sql: ... WHERE MONTH(</code>column<code>) = &quot;$input&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;month('column', $label);</code></pre>
<p><a name="year"></a></p>
<h3>year</h3>
<p><code>sql: ... WHERE YEAR(</code>column<code>) = &quot;$input&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;year('column', $label);</code></pre>
<p><a name="findinset"></a></p>
<h3>findInSet</h3>
<p><code>sql: ... WHERE FIND_IN_SET(&quot;$input&quot;, $column)</code>:</p>
<pre><code class="language-php">$filter-&gt;findInSet('column', $label);</code></pre>
<p><a name="where"></a></p>
<h3>复杂查询where</h3>
<p>可以用where来构建比较复杂的查询过滤</p>
<p><code>sql: ... WHERE</code>title<code>LIKE &quot;%$input&quot; OR</code>content<code>LIKE &quot;%$input&quot;</code>:</p>
<pre><code class="language-php">$filter-&gt;where('search', function ($query) {
$query-&gt;where('title', 'like', &quot;%{$this-&gt;input}%&quot;)
-&gt;orWhere('content', 'like', &quot;%{$this-&gt;input}%&quot;);
});</code></pre>
<p><code>sql: ... WHERE</code>rate<code>&gt;= 6 AND</code>created_at<code>= {$input}</code>:</p>
<pre><code class="language-php">$filter-&gt;where('Text', function ($query) {
$query-&gt;whereRaw(&quot;`rate` &gt;= 6 AND `created_at` = {$this-&gt;input}&quot;);
});</code></pre>
<p>关系查询,查询对应关系<code>profile</code>的字段:</p>
<pre><code class="language-php">$filter-&gt;where('mobile', function ($query) {
$query-&gt;whereHas('profile', function ($query) {
$query-&gt;where('address', 'like', &quot;%{$this-&gt;input}%&quot;)-&gt;orWhere('email', 'like', &quot;%{$this-&gt;input}%&quot;);
});
}, '地址或手机号');</code></pre>
<p><a name="whereBetween"></a></p>
<h3>复杂范围查询whereBetween</h3>
<p>通过<code>whereBetween</code>可以自定义范围查询</p>
<pre><code class="language-php">$filter-&gt;whereBetween('created_at', function ($q) {
$start = $this-&gt;input['start'] ?? null;
$end = $this-&gt;input['end'] ?? null;
$q-&gt;whereHas('goods', function ($q) use ($start) {
if ($start !== null) {
$q-&gt;where('price', '&gt;=', $start);
}
if ($end !== null) {
$q-&gt;where('price', '&lt;=', $end);
}
});
}); </code></pre>
<p>同时这个方法也支持时间日期范围查询</p>
<pre><code class="language-php">$filter-&gt;whereBetween('created_at', function ($q) {
...
})-&gt;datetime(); </code></pre>
<p><a name="group"></a></p>
<h3>过滤器组group</h3>
<p>有时候对同一个字段要设置多种筛选方式,可以通过下面的方式实现</p>
<pre><code class="language-php">$filter-&gt;group('rate', function ($group) {
$group-&gt;gt('大于');
$group-&gt;lt('小于');
$group-&gt;nlt('不小于');
$group-&gt;ngt('不大于');
$group-&gt;equal('等于');
});</code></pre>
<p>有下面的几个方法可以调用</p>
<pre><code class="language-php">// 等于
$group-&gt;equal();
// 不等于
$group-&gt;notEqual();
// 大于
$group-&gt;gt();
// 小于
$group-&gt;lt();
// 大于等于
$group-&gt;nlt();
// 小于等于
$group-&gt;ngt();
// 匹配
$group-&gt;match();
// 复杂条件
$group-&gt;where();
// like查询
$group-&gt;like();
// like查询
$group-&gt;contains();
// ilike查询
$group-&gt;ilike();
// 以输入的内容开头
$group-&gt;startWith();
// 以输入的内容结尾
$group-&gt;endWith();</code></pre>
<p><a name="scope"></a></p>
<h3>范围查询scope</h3>
<p>可以把你最常用的查询定义为一个查询范围,它将会出现在筛选按钮的下拉菜单中,下面是几个例子:</p>
<pre><code class="language-php">$filter-&gt;scope('male', '男性')-&gt;where('gender', 'm');
// 多条件查询
$filter-&gt;scope('new', '最近修改')
-&gt;whereDate('created_at', date('Y-m-d'))
-&gt;orWhere('updated_at', date('Y-m-d'));
// 关联关系查询
$filter-&gt;scope('address')-&gt;whereHas('profile', function ($query) {
$query-&gt;whereNotNull('address');
});
$filter-&gt;scope('trashed', '被软删除的数据')-&gt;onlyTrashed();</code></pre>
<p>scope方法第一个参数为查询的key, 会出现的url参数中,第二个参数是下拉菜单项的label, 如果不填,第一个参数会作为label显示</p>
<p>scope方法可以链式调用任何eloquent查询条件,效果参考Demo</p>
<p><a name="form"></a></p>
<h2>表单类型</h2>
<p><a name="text"></a></p>
<h3>text</h3>
<p>表单类型默认是<code>text input</code>,可以设置<code>placeholder</code>:</p>
<pre><code class="language-php">$filter-&gt;equal('column')-&gt;placeholder('请输入。。。');</code></pre>
<p>也可以通过下面的一些方法来限制用户输入格式:</p>
<pre><code class="language-php">$filter-&gt;equal('column')-&gt;url();
$filter-&gt;equal('column')-&gt;email();
$filter-&gt;equal('column')-&gt;integer();
$filter-&gt;equal('column')-&gt;ip();
$filter-&gt;equal('column')-&gt;mac();
$filter-&gt;equal('column')-&gt;mobile();
// $options 参考 https://github.com/RobinHerbots/Inputmask/blob/4.x/README_numeric.md
$filter-&gt;equal('column')-&gt;decimal($options = []);
// $options 参考 https://github.com/RobinHerbots/Inputmask/blob/4.x/README_numeric.md
$filter-&gt;equal('column')-&gt;currency($options = []);
// $options 参考 https://github.com/RobinHerbots/Inputmask/blob/4.x/README_numeric.md
$filter-&gt;equal('column')-&gt;percentage($options = []);
// $options 参考 https://github.com/RobinHerbots/Inputmask, $icon为input前面的图标
$filter-&gt;equal('column')-&gt;inputmask($options = [], $icon = 'pencil');</code></pre>
<p><a name="select-table"></a></p>
<h3>表格选择器 (selectTable)</h3>
<pre><code class="language-php">use App\Admin\Renderable\UserTable;
use Dcat\Admin\Models\Administrator;
$filter-&gt;equal('user_id')
-&gt;selectTable(UserTable::make(['id' =&gt; ...])) // 设置渲染类实例,并传递自定义参数
-&gt;title('弹窗标题')
-&gt;dialogWidth('50%') // 弹窗宽度,默认 800px
-&gt;model(Administrator::class, 'id', 'name'); // 设置编辑数据显示
// 上面的代码等同于
$filter-&gt;equal('user_id')
-&gt;selectTable(UserTable::make(['id' =&gt; ...])) // 设置渲染类实例,并传递自定义参数
-&gt;options(function ($v) { // 设置编辑数据显示
if (! $v) {
return [];
}
return Administrator::find($v)-&gt;pluck('name', 'id');
});</code></pre>
<p>定义渲染类如下,需要继承<code>Dcat\Admin\Grid\LazyRenderable</code></p>
<p>> {tip} 这里使用了数据表格异步加载功能,详细用法请参考<a href="lazy.md">异步加载</a></p>
<pre><code class="language-php">&lt;?php
namespace App\Admin\Renderable;
use Dcat\Admin\Grid;
use Dcat\Admin\Grid\LazyRenderable;
use Dcat\Admin\Models\Administrator;
class UserTable extends LazyRenderable
{
public function grid(): Grid
{
// 获取外部传递的参数
$id = $this-&gt;id;
return Grid::make(new Administrator(), function (Grid $grid) {
$grid-&gt;column('id');
$grid-&gt;column('username');
$grid-&gt;column('name');
$grid-&gt;column('created_at');
$grid-&gt;column('updated_at');
// 指定行选择器选中时显示的值的字段名称
// 指定行选择器选中时显示的值的字段名称
// 指定行选择器选中时显示的值的字段名称
// 如果表格数据中带有 “name”、“title”或“username”字段,则可以不用设置
$grid-&gt;rowSelector()-&gt;titleColumn('username');
$grid-&gt;quickSearch(['id', 'username', 'name']);
$grid-&gt;paginate(10);
$grid-&gt;disableActions();
$grid-&gt;filter(function (Grid\Filter $filter) {
$filter-&gt;like('username')-&gt;width(4);
$filter-&gt;like('name')-&gt;width(4);
});
});
}
}</code></pre>
<h4>多选 (multipleSelectTable)</h4>
<p>多选的用法与上述<code>selectTable</code>方法一致</p>
<pre><code class="language-php">$filter-&gt;in('user_id')
-&gt;multipleSelectTable(UserTable::make(['id' =&gt; $form-&gt;getKey()])) // 设置渲染类实例,并传递自定义参数
-&gt;max(10) // 最多选择 10 个选项,不传则不限制
-&gt;model(Administrator::class, 'id', 'name'); // 设置编辑数据显示</code></pre>
<p><a name="select"></a></p>
<h3>select</h3>
<pre><code class="language-php">$filter-&gt;equal('column')-&gt;select(['key' =&gt; 'value'...]);
// 或者从api获取数据,api的格式参考model-form的select组件
$filter-&gt;equal('column')-&gt;select('api/users');</code></pre>
<p><a name="multipleSelect"></a></p>
<h3>multipleSelect</h3>
<p>一般用来配合<code>in</code>和<code>notIn</code>两个需要查询数组的查询类型使用,也可以在<code>where</code>类型的查询中使用:</p>
<pre><code class="language-php">$filter-&gt;in('column')-&gt;multipleSelect(['key' =&gt; 'value'...]);
// 或者从api获取数据,api的格式参考model-form的multipleSelect组件
$filter-&gt;in('column')-&gt;multipleSelect('api/users');</code></pre>
<p><a name="datetime"></a></p>
<h3>datetime</h3>
<p>通过日期时间组件来查询,<code>$options</code>的参数和值参考<a href="http://eonasdan.github.io/bootstrap-datetimepicker/Options/">bootstrap-datetimepicker</a></p>
<pre><code class="language-php">$filter-&gt;equal('column')-&gt;datetime($options);
// `date()` 相当于 `datetime(['format' =&gt; 'YYYY-MM-DD'])`
$filter-&gt;equal('column')-&gt;date();
// `time()` 相当于 `datetime(['format' =&gt; 'HH:mm:ss'])`
$filter-&gt;equal('column')-&gt;time();
// `day()` 相当于 `datetime(['format' =&gt; 'DD'])`
$filter-&gt;equal('column')-&gt;day();
// `month()` 相当于 `datetime(['format' =&gt; 'MM'])`
$filter-&gt;equal('column')-&gt;month();
// `year()` 相当于 `datetime(['format' =&gt; 'YYYY'])`
$filter-&gt;equal('column')-&gt;year();
</code></pre>
<p>如果你的时间日期字段在数据库中存储的是时间戳类型,那么可以通过<code>toTimestamp</code>方法把表单的值转化为时间戳</p>
<pre><code class="language-php">$filter-&gt;equal('column')-&gt;datetime($options)-&gt;toTimestamp();</code></pre>
<p><a name="method"></a></p>
<h2>常用方法</h2>
<p><a name="width"></a></p>
<h3>过滤器宽度 (width)</h3>
<pre><code class="language-php">// 设置为“1-12”之间的值,默认值是“3”
$filter-&gt;equal('column')-&gt;width(3);
// 也可以写死宽度
$filter-&gt;equal('column')-&gt;width('250px');</code></pre>
<p><a name="default"></a></p>
<h3>设置默认值 (default)</h3>
<pre><code class="language-php">$filter-&gt;equal('column')-&gt;default('text');
$filter-&gt;equal('column')-&gt;select([0 =&gt; 'PHP', 1 =&gt; 'Java'])-&gt;default(1);</code></pre>
<p><a name="expand"></a></p>
<h3>展开过滤器 (expand)</h3>
<pre><code class="language-php">$filter-&gt;expand();
$filter-&gt;equal('column');
...</code></pre>
<p><a name="withoutInputBorder"></a></p>
<h3>不显示过滤器input输入框的边框</h3>
<pre><code class="language-php">$filter-&gt;withoutInputBorder();
$filter-&gt;equal('column');
...</code></pre>
<p><a name="style"></a></p>
<h3>设置过滤器容器样式</h3>
<pre><code class="language-php">$filter-&gt;style('padding:0');
$filter-&gt;equal('column');
...</code></pre>
<p><a name="padding"></a></p>
<h3>设置过滤器容器padding</h3>
<pre><code class="language-php">$filter-&gt;padding('10px', '10px', '10px', '10px');
$filter-&gt;equal('column');
...</code></pre>
<h3>忽略筛选项 (ignore)</h3>
<p>通过<code>ignore</code>方法可以在提交表单时忽略当前筛选项</p>
<pre><code class="language-php">$filter-&gt;equal('column')-&gt;ignore();</code></pre>
<p><a name="relation"></a></p>
<h2>关联关系字段查询</h2>
<p>假设你的模型如下</p>
<pre><code class="language-php">class User extends Model
{
public function profile()
{
return $this-&gt;hasOne(...);
}
public function myPosts()
{
return $this-&gt;hasMany(...);
}
}</code></pre>
<p>通过下面的方法可以查询<code>profiles</code>表的<code>first_name</code>字段以及<code>posts</code>表的<code>title</code>字段</p>
<pre><code class="language-php">$grid-&gt;filter(function ($filter) {
$filter-&gt;like('profile.first_name');
$filter-&gt;like('myPosts.title');
});</code></pre>
<p>如果安装了 <a href="https://github.com/jqhph/laravel-wherehasin">dcat/laravel-wherehasin</a>,则会优先使用<code>whereHasIn</code>方法进行查询操作</p>
<p><a name="extend"></a></p>
<h2>自定义过滤器</h2>
<p>下面通过<code>between</code>的实现来讲解下怎么自定义过滤器。</p>
<p>首先新建一个过滤器类继承<code>Dcat\Admin\Grid\Filter\AbstractFilter</code>:</p>
<pre><code class="language-php">&lt;?php
namespace Dcat\Admin\Grid\Filter;
use Dcat\Admin\Admin;
use Dcat\Admin\Grid\Filter\Presenter\DateTime;
use Illuminate\Support\Arr;
class Between extends AbstractFilter
{
// 自定义你的过滤器显示模板
protected $view = 'admin::filter.between';
// 这个方法用于生成过滤器字段的唯一id
// 通过这个唯一id则可以用js代码对其进行操作
public function formatId($column)
{
$id = str_replace('.', '_', $column);
$name = $this-&gt;parent-&gt;getGrid()-&gt;getName();
return ['start' =&gt; &quot;{$name}{$id}_start&quot;, 'end' =&gt; &quot;{$name}{$id}_end&quot;];
}
// form表单name属性格式化
protected function formatName($column)
{
$columns = explode('.', $column);
if (count($columns) == 1) {
$name = $columns[0];
} else {
$name = array_shift($columns);
foreach ($columns as $column) {
$name .= &quot;[$column]&quot;;
}
}
return ['start' =&gt; &quot;{$name}[start]&quot;, 'end' =&gt; &quot;{$name}[end]&quot;];
}
// 创建条件
// 这里构建的条件支持`Laravel query builder`即可。
public function condition($inputs)
{
if (!Arr::has($inputs, $this-&gt;column)) {
return;
}
$this-&gt;value = Arr::get($inputs, $this-&gt;column);
$value = array_filter($this-&gt;value, function ($val) {
return $val !== '';
});
if (empty($value)) {
return;
}
if (!isset($value['start']) &amp;&amp; isset($value['end'])) {
// 这里返回的数组相当于
// $query-&gt;where($this-&gt;column, '&lt;=', $value['end']);
return $this-&gt;buildCondition($this-&gt;column, '&lt;=', $value['end']);
}
if (!isset($value['end']) &amp;&amp; isset($value['start'])) {
// 这里返回的数组相当于
// $query-&gt;where($this-&gt;column, '&gt;=', $value['end']);
return $this-&gt;buildCondition($this-&gt;column, '&gt;=', $value['start']);
}
$this-&gt;query = 'whereBetween';
// 这里返回的数组相当于
// $query-&gt;whereBetween($this-&gt;column, $value['end']);
return $this-&gt;buildCondition($this-&gt;column, $this-&gt;value);
}
// 自定义过滤器表单显示方式
public function datetime($options = [])
{
$this-&gt;view = 'admin::filter.betweenDatetime';
DateTime::collectAssets();
$this-&gt;setupDatetime($options);
return $this;
}
protected function setupDatetime($options = [])
{
$options['format'] = Arr::get($options, 'format', 'YYYY-MM-DD HH:mm:ss');
$options['locale'] = Arr::get($options, 'locale', config('app.locale'));
$startOptions = json_encode($options);
$endOptions = json_encode($options + ['useCurrent' =&gt; false]);
// 通过上面格式化后的id对表单进行你想要的操作
$script = &lt;&lt;&lt;JS
$('#{$this-&gt;id['start']}').datetimepicker($startOptions);
$('#{$this-&gt;id['end']}').datetimepicker($endOptions);
$(&quot;#{$this-&gt;id['start']}&quot;).on(&quot;dp.change&quot;, function (e) {
$('#{$this-&gt;id['end']}').data(&quot;DateTimePicker&quot;).minDate(e.date);
});
$(&quot;#{$this-&gt;id['end']}&quot;).on(&quot;dp.change&quot;, function (e) {
$('#{$this-&gt;id['start']}').data(&quot;DateTimePicker&quot;).maxDate(e.date);
});
JS;
Admin::script($script);
}
}</code></pre>
<p><code>admin::filter.between</code>模板内容如下:</p>
<pre><code class="language-php">&lt;div class=&quot;filter-input col-sm-{{ $width }} &quot; style=&quot;{!! $style !!}&quot;&gt;
&lt;div class=&quot;form-group&quot; &gt;
&lt;div class=&quot;input-group input-group-sm&quot;&gt;
&lt;span class=&quot;input-group-addon&quot;&gt;&lt;b&gt;{!! $label !!}&lt;/b&gt;&lt;/span&gt;
&lt;input type=&quot;text&quot; class=&quot;form-control&quot; placeholder=&quot;{{$label}}&quot; name=&quot;{{$name['start']}}&quot; value=&quot;{{ request($name['start'], \Illuminate\Support\Arr::get($value, 'start')) }}&quot;&gt;
&lt;span class=&quot;input-group-addon&quot; style=&quot;border-left: 0; border-right: 0;&quot;&gt;To&lt;/span&gt;
&lt;input type=&quot;text&quot; class=&quot;form-control&quot; placeholder=&quot;{{$label}}&quot; name=&quot;{{$name['end']}}&quot; value=&quot;{{ request($name['end'], \Illuminate\Support\Arr::get($value, 'end')) }}&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</code></pre>
<p><code>admin::filter.betweenDatetime</code>模板内容如下:</p>
<pre><code class="language-php">&lt;div class=&quot;filter-input col-sm-{{ $width }}&quot; style=&quot;{!! $style !!}&quot;&gt;
&lt;div class=&quot;form-group&quot;&gt;
&lt;div class=&quot;input-group input-group-sm&quot;&gt;
&lt;span class=&quot;input-group-addon&quot;&gt;&lt;b&gt;{{$label}}&lt;/b&gt; &amp;nbsp;&lt;i class=&quot;fa fa-calendar&quot;&gt;&lt;/i&gt;&lt;/span&gt;
&lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;{{$id['start']}}&quot; placeholder=&quot;{{$label}}&quot; name=&quot;{{$name['start']}}&quot; value=&quot;{{ request($name['start'], \Illuminate\Support\Arr::get($value, 'start')) }}&quot;&gt;
&lt;span class=&quot;input-group-addon&quot; style=&quot;border-left: 0; border-right: 0;&quot;&gt;To&lt;/span&gt;
&lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;{{$id['end']}}&quot; placeholder=&quot;{{$label}}&quot; name=&quot;{{$name['end']}}&quot; value=&quot;{{ request($name['end'], \Illuminate\Support\Arr::get($value, 'end')) }}&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</code></pre>
<p>现在只要调用<code>extend</code>方法可以使用了,打开<code>app/Admin/bootstrap.php</code>,加入以下代码:</p>
<pre><code class="language-php">Filter::extend('customBetween', Filter\Between::class);</code></pre>
<p>使用:</p>
<pre><code class="language-php">$filter-&gt;customBetween('created_at')-&gt;datetime();</code></pre>