改进TP3.2.3中Model.class.php中的getField方法
2018-05-31
后端
改进TP3.2.3中Model.class.php中的getField方法,使之支持带逗号的函数增加的代码只有改进-begin到改进-end之间的代码,其他的就是注释原语句。原来的getField:支持:getField('id, user_name, role_id',true);不支持:getField(array('id',"concat(user_name,'[',id,']') as user_name","concat(user_name,'[',role_id,']') as role_id"),true);返回都是null改进后:支持:getField('id, user_name, role_id',true);支持:getField(array('id',"concat(user_name,'[',id,']') as user_name","concat(user_name,'[',role_id,']') as role_id"),true);支持:getField("concat(userName,'[',id,']') as id",true);支持:getField(array("concat(userName,'[',id,']') as id"),true);=============代码详情======================publicfunction getField($field, $sepa =null){ $options['field']= $field; $options = $this->_parseOptions($options);// 判断查询缓存if(isset($options['cache'])){ $cache = $options['cache']; $key = is_string($cache['key'])? $cache['key']: md5($sepa . serialize($options)); $data = S($key,'', $cache);if(false!== $data){return $data;}} $is_multi =false;// 是否是多字段 $is_fn =false;// 单字段是否是函数// 改进-beginif(is_array($field)){if(count($field)>1){ $is_multi =true; $_field = $field;}else{ $field = $field[0]; $is_fn = strpos($field,'(');}}else{ $field = trim($field); $is_fn = strpos($field,'(');if(false=== $is_fn && strpos($field,',')){ $is_multi =true; $_field = explode(',', $field);}}// 改进-end// 此处为原代码语句,注释之! $field = trim($field);// 此处为原代码语句,注释之! if (strpos($field, ',') && false !== $sepa) { // 多字段if($is_multi &&false!== $sepa){// 多字段if(!isset($options['limit'])){ $options['limit']= is_numeric($sepa)? $sepa :'';} $resultSet = $this->db->select($options);if(!empty($resultSet)){if(is_string($resultSet)){return $resultSet;}// 此处为原代码语句,注释之! $_field = explode(',', $field); $field = array_keys($resultSet[0]); $key1 = array_shift($field); $key2 = array_shift($field); $cols = array(); $count = count($_field);foreach($resultSet as $result){ $name = $result[$key1];if(2== $count){ $cols[$name]= $result[$key2];}else{ $cols[$name]= is_string($sepa)? implode($sepa, array_slice($result,1)): $result;}}if(isset($cache)){ S($key, $cols, $cache);}return $cols;}}else{// 查找一条记录// 返回数据个数if(true!== $sepa){// 当sepa指定为true的时候 返回所有数据 $options['limit']= is_numeric($sepa)? $sepa :1;} $result = $this->db->select($options);if(!empty($result)){if(is_string($result)){return $result;}if(true!== $sepa &&1== $options['limit']){ $data = reset($result[0]);if(isset($cache)){ S($key, $data, $cache);}return $data;}foreach($result as $val){// 此处为原代码语句,注释之! $array[] = $val[$field]; $array[]= $is_fn ? current($val): $val[$field];}if(isset($cache)){ S($key, $array, $cache);}return $array;}}returnnull;}