定义此basemodel,其它model继承basemodel
<?php namespace app\models; use Yii; use yii\db\ActiveRecord; use yii\behaviors\TimestampBehavior; class BaseModel extends ActiveRecord { /** * @inheritdoc */ public function behaviors() { return [ TimestampBehavior::className(), ]; } /** * @inheritdoc */ public static function primaryKey() { return ['id']; } /** * @inheritdoc */ public static function tableName() { return strtolower(basename(str_replace('\\','/',self::className()))); } /** * @inheritdoc */ public function rules() { $rules = [ [$this->getTableSchema()->getColumnNames(),'safe'], ]; return $rules; } /** * author vking * 处理数据库字段搜索, * 根据字段name自动joinwith model * @param $params */ function query($params,$isCount=false,$getQuery=false){ $tbname=self::tableName(); $query = self::find()->alias(self::tableName()); foreach($params as $table=>$ques){ if($table=='groupby'){ $query->groupBy($ques); unset($params[$table]); continue; } if($table=='select'){ $query->addSelect("$tbname.*"); $query->addSelect($ques); unset($params[$table]); continue; } if($table=='with'){ foreach ($ques as $_wt=>$_wq){ $query->with([ $_wt=>function($q) use ($_wq){ $q->andWhere($_wq); } ]); } unset($params[$table]); continue; } if($table=='join'){ if($ques['table']){ $ques=[$ques]; } foreach ($ques as $_que){ $query->join($_que['type'],$_que['table'],$_que['on']); } unset($params[$table]); continue; } if(is_string($ques)){ if(empty($params[$tbname])){ $params[$tbname]=[]; } $params[$tbname][$table]=$ques; unset($params[$table]); } } foreach($params as $table=>$ques){ if($table=='this') continue; if($table!=$tbname){ $query->joinWith($table); } foreach($ques as $field=>$val){ $field = trim($field); $val = is_string($val)?trim($val):$val; if(substr($field,0,2)=='__'){ continue; } if(isset($val) && $val!=""){ /** * [between]=>[b1,b2] * [in]=>[1,2,3] * [like]=>str * [...]=>str */ if(!is_array($val)){ $query->andWhere([ $table.'.'.$field=>$val ]); }else{ foreach ($val as $exp=>$_val){ $_val = is_string($_val)?trim($_val):$_val; if(!(isset($_val) && $_val!="")){ continue; } if($exp=='between'){ $query->andWhere([ $exp,$table.'.'.$field,$_val[0],$_val[1] ]); }else{ $filterControls = [ 'lt' => '<', 'gt' => '>', 'lte' => '<=', 'gte' => '>=', 'eq' => '=', 'neq' => '!=', 'nin' => 'NOT IN', ]; $exp= $filterControls[$exp]?$filterControls[$exp]:$exp; $query->andWhere([ $exp,$table.'.'.$field,$_val ]); } } } } } } //$query->groupBy($tbname.'.'.self::primaryKey()[0]); if($getQuery) return $query; $total=0; if($isCount){ $total = intval($query->count()); } $query->offset($params['this']['offset'])->limit($params['this']['limit']?$params['this']['limit']:'20'); $sort=$params['this']['orderby']?$params['this']['orderby']:$params['this']['sort']; if($sort){ $query->orderBy($sort); } $data=$query->asArray()->all(); return ['list'=>$data,'total'=>$total]; } }
使用方式
JS POST 参数:
参数说明 this 是分页相关,其它为具体model,下面是从cron这个model的查询条件
{ "this": { "page": 1, "offset": 0, "limit": 30, "orderby": "cron.id desc" }, "cron": { "path": "", "param": { "like": "" }, "status": "", "crontime": { "gt": -1 } } }
PHP 查询:
function getCrons(){ $searchModel = new Cron(); $params=\Yii::$app->request->getBodyParams(); $data = $searchModel->query($params,true); return $data; }
打赏
微信扫一扫,打赏作者吧~