laravel-admin 的 between()->datetime();

laravel 版本 6.5.2

laravel-admin 版本 1.5

 

下面是laravel-admin 的一个筛选组件datetime,第一个选项可以格式化组件样式,比如只筛选年,或者月啥的,第二个参数是我自己加的

$grid->filter(function ($filter) {
    $filter->disableIdFilter();
    $filter->between('create_time', 'Created Time')->datetime([],true);
});

会生成一个这样的筛选框,我用这个来筛选数据的创建时间,字段:create_time

但是会有一个问题,create_time字段是时间戳格式的,而这个筛选,是字符串

跟踪源码,找到了这个datetime方法,在 vendor/encore/laravel-admin/src/Grid/Filter/Between.php,下面是解决方法

1,在Between类中加入$timestamp属性

2,在Between类中的 condition 方法里加上判断

public function condition($inputs)
{
    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;
    }

    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';
        
    //下面这4行
    if($this->timestamp){
        $this->value['start'] = strtotime($this->value['start']);
        $this->value['end'] = strtotime($this->value['end']);
    }

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

3,在 datetime 方法中设置 timestamp 的值

public function datetime($options = [],$timestamp = false)
{
    $this->view = 'admin::filter.betweenDatetime';

    $this->setupDatetime($options);

    $this->timestamp = $timestamp;

    return $this;
}

4,回到开头,在调用datetime方法的时候,第二个参数传true就可以了

============================================================================================

调用顺序

$grid->filter方法 >> HasFilter类 >> filter方法 >> Filter类 >> __call方法 >> Between类 >> date
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章