使用场景:在girdView搜索栏里实现按时间区间来筛选数据
以下为个人常用代码块:
<?php
use yii\helpers\Html;
use kartik\grid\GridView;
$visible ? $url = 'awards' : $url = 'index';
?>
<div class="awards-record-index">
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
[
'label'=>'手机号',
'value'=>function($model) {
return $model->user->mobile;
},
'visible'=> $visible,
],
//----------------------------------------------时间区间选择器的使用---------------------------------------------------------
[
'attribute' => 'created_at', //时间戳类型若为datetime则value不用格式化时间
'filterType' => GridView::FILTER_DATE_RANGE,
'value' => function($model) {
if ($model->created_at) {
return date('Y-m-d H:i:s',$model->created_at);
}
return null;
},
'filterWidgetOptions' => [
'startAttribute' => 'created_at_c', //开始时间的属性
'endAttribute' => 'created_at_e', //结束时间的属性
'convertFormat'=>true, // 重要为true是则使用local->format的时间格式,将PHP的时间格式转换为js的时间格式
'pluginOptions' => [
'format' => 'yyyy-mm-dd hh:ii:ss',//日期格式
'timePicker'=>true, //显示时间
// 'timePickerIncrement'=>5,//分钟间隔
'timePicker24Hour' => true, //24小时制
'locale'=>['format' => 'Y-m-d H:i:s'], //php格式化时间
]
],
],
//----------------------------------------------单时间选择器的使用---------------------------------------------------------
],
'toolbar' => [
['content' =>
Html::a('<i class="glyphicon glyphicon-repeat"></i>', [$url], ['data-pjax' => 0, 'class' => 'btn btn-default', 'title' => '刷新']),
],
'{export}',
'{toggleData}'
],
'exportConfig'=> [
GridView::EXCEL => ['filename' =>'抽奖记录'],
],
'bordered' => true,
'striped' => false,
'condensed' => false,
'hover' => true,
'panel' => [
'type' => GridView::TYPE_DEFAULT
]
]); ?>
$searchModel修改如下:
created_at类型为timestamp时:
public $created_at_c; //开始时间
public $created_at_e; //结束时间
public function rules()
{
return [
[['created_at','created_at_c', 'created_at_e'],'save']//修改created_at为该规则,其他不变不然规则不合法则无法执行搜索
];
}
在search() 方法中加一下代码可以实现查询某个时间区间内的所有数据:
if ($this->created_at_c && $this->created_at_e) {
$create_start = strtotime($this->created_at_c);
$create_end = strtotime($this->created_at_e);
$query->andWhere(['between', 'created_at', $create_start, $create_end]);
}
created_at类型为datetime时:
public $created_at_c; //开始时间
public $created_at_e; //结束时间
public function rules()
{
return [
[['created_at','created_at_c', 'created_at_e'],'save']
];
}
在search() 方法中加一下代码可以实现查询某个时间区间内的所有数据:
if ($this->created_at_c && $this->created_at_e) {
$query->andWhere(['between', 'created_at', $this->created_at_c, $this->created_at_e]);
}
优化:你可以对created_at_c和created_at_e做时间值校验,保证时间格式和搜索值类型一致。