laravel-admin实现时间搓区间查询

数据表时间字段使用的时间搓保存,使用查询过滤时发现时间区间查询没有关于时间搓查询的能力,只能是自己实现一个

表格查询过滤的between类型,默认是使用控件输入原值作为查询参数

Encore\Admin\Grid\Filter\Between类文件的condition方法源码

  /**
   * Get condition of this filter.
   *
   * @param array $inputs
   *
   * @return mixed
   */
  public function condition($inputs)
  {
      if ($this->ignore) {
          return;
      }

      if (!Arr::has($inputs, $this->column)) {
          return;
      }

      $this->value = Arr::get($inputs, $this->column);

      $value = array_filter($this->value, function ($val) {
          return $val !== '';
      });

      if (empty($value)) {
          return;
      }
      // 以下几行代码可以看出,`$value`输入数据是未经过处理的
      if (!isset($value['start'])) {
          return $this->buildCondition($this->column, '<=', $value['end']);
      }

      if (!isset($value['end'])) {
          return $this->buildCondition($this->column, '>=', $value['start']);
      }

      $this->query = 'whereBetween';

      return $this->buildCondition($this->column, $this->value);
  }

只要将输入数据处理为自己想要的格式就可以实现时间搓区间查询

app/Admin/Extensions/Grid目录下新建FilterBetween类,继承Encore\Admin\Grid\Filter\Between并重写condition方法

<?php
namespace App\Admin\Extensions\Grid;

use Illuminate\Support\Arr;
use Encore\Admin\Grid\Filter\Between;

/**
 * 查询区间过滤
 */
class FilterBetween extends Between
{
    // 数据处理回调
    protected $valueMapCallback = null;
    // 设置数据处理回调
    public function valueMap( callable $c ) {
        $this->valueMapCallback = $c;

        return $this;
    }
    // 时间搓数据 将数据转为时间搓
    public function timestampValue() {
        $this->valueMapCallback = function($v) {
            return \strtotime( $v );
        };

        return $this;
    }

    /**
     * Get condition of this filter.
     *
     * @param array $inputs
     *
     * @return mixed
     */
    public function condition($inputs)
    {
        if ($this->ignore) {
            return;
        }

        if (!Arr::has($inputs, $this->column)) {
            return;
        }

        $this->value = Arr::get($inputs, $this->column);

        $value = array_filter($this->value, function ($val) {
            return $val !== '';
        });

        if (empty($value)) {
            return;
        }
        // begin 新增的代码, 有数据处理回调时将数据处理一遍
        if( $this->valueMapCallback ) {
            $value = \array_map( $this->valueMapCallback, $value );
        }
        // end
        if (!isset($value['start'])) {
            return $this->buildCondition($this->column, '<=', $value['end']);
        }

        if (!isset($value['end'])) {
            return $this->buildCondition($this->column, '>=', $value['start']);
        }

        $this->query = 'whereBetween';

        return $this->buildCondition($this->column, $value);
    }
}

app/Admin/bootstrap.php中,将表格查询过滤的between类型的实现类替换为新建的FilterBetween

// 文件头部添加
use Encore\Admin\Grid\Filter;
use App\Admin\Extensions\Grid\FilterBetween;

// ...
// 替换
Filter::extend( 'between',  FilterBetween::class);

新between类型的使用

添加时间区间过滤时开启数据处理回调就可以了

  $grid->filter(function( $filter )use($types) {
      // ...
      // 调用 timestampValue 函数开启数据转时间搓回调
      $filter->between('start_time', __("Start time"))->datetime()->timestampValue();
      // ...
  });
posted @ 2022-09-27 14:59  何必丶丶  阅读(149)  评论(0编辑  收藏  举报