改进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;// 单字段是否是函数
// 改进-begin
if(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;
}