二次开发时遇到一个搜索问题,查询某个时间段的数据
页面是GridView生成的,一般应该是修改时间的搜索框,
不过
因为时间有别的用处,我们是这样的样子。
现在需求是,选择员工姓名或者备注或者其他条件,再选择时间段,能查询出相应数据。
根据上面的时间段搜索
index页面是一个点击事件,get传参,地址是这样的:
http://www.abcdefg.com/index.php?r=worker-xj/index&time_zone=2020-04-25|2020-05-18&companyname=&workname=%E6%99%AE%E9%80%9A%E5%91%98%E5%B7%A5&shname=&result=&remarks=
这样明显不能直接使用yii的search方法,因此需要一些改造。
控制器中的index方法:
思路是判断时间参数time_zone是否存在,不存在就是正常的搜索显示,存在就是点击了查询按钮。
点击查询按钮之后,修改数据格式,要求跟小部件搜索时的数据结构相同。这样就可以访问到search方法了。
public function actionIndex()
{
#菜单权限判断
if(!\DbHelper::checkUserRoute("worker-xj/index")){
$msg = "权限不足!";
$url = Url::toRoute(['site/index']);
return $this->redirect(['site/error', 'msg' => $msg, 'url' => $url]);
}
$arr=Yii::$app->request->queryParams;
$searchModel = new WorkerXjSearch();
if(isset($arr['time_zone'])){
$time_zone_arr = explode("|", $arr['time_zone']);
$stime = strtotime($time_zone_arr[0]." 00:00:00");
$etime = strtotime($time_zone_arr[1]." 23:59:59");
$array=[];
$arrar2['companyid'] =$arr['companyname'];
$arrar2['workName']= $arr['workname'];
$arrar2['name'] = $arr['shname'];
$arrar2['result'] = $arr['result'];
$arrar2['remarks'] = $arr['remarks'];
$arrar2['stime'] =$stime;
$arrar2['etime'] =$etime;
$array['WorkerXjSearch']=$arrar2;
$array['r']= "worker-xj/index";
$dataProvider = $searchModel->search($array);
}else{
$arr['time_zone']=date("Y-m-d").'|'.date("Y-m-d");
$dataProvider = $searchModel->search($arr);
}
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'time_zone' => $arr['time_zone']
]);
}
然后需要在当前模块的searchmodel里添加时间依赖,stime,etime不是数据库里的字段
public function rules()
{
return [
[['id', 'companyid', 'workerid', 'pics', 'remarks', 'workName','result', 'zjdName','name'], 'safe'],
[['ctime'], 'integer'],
[['stime','etime'],'integer'],
];
}
在当前模块的model里加上
public $stime;
public $etime;
最后修改search里的时间区间
$query->andFilterWhere(['>=', 'worker_xj.ctime', $this->stime]);
$query->andFilterWhere(['<=', 'worker_xj.ctime', $this->etime]);
这样就可以实现效果了。
不过必须得先选择其他条件,最后点击查询按钮,因为是根据time_zone是否存在来判断执行区域的
可能也有其他更好的写法,以后遇到这再加上吧