dcat-admin

dcat-admin


查询过滤

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

页面列表

ITEM_HTML