增加的代码只有 改进-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);
=============代码详情======================
public function 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;
}
}
return null;
}
不会用git,望老大改进getField中field参数对多个带逗号的函数作为字段的支持。只在mysql连接类型中测试通过,其他数据库类型没测试。如有问题请跟帖讨论。
最佳答案
