改进TP3.2.3中Model.class.php中的getField方法

  1. 改进TP3.2.3Model.class.php中的getField方法,使之支持带逗号的函数
  2. 增加的代码只有改进-begin到改进-end之间的代码,其他的就是注释原语句。
  3. 原来的getField
  4. 支持:getField('id, user_name, role_id',true);
  5. 不支持:getField(array('id',"concat(user_name,'[',id,']') as user_name","concat(user_name,'[',role_id,']') as role_id"),true);返回都是null
  6. 改进后:
  7. 支持:getField('id, user_name, role_id',true);
  8. 支持:getField(array('id',"concat(user_name,'[',id,']') as user_name","concat(user_name,'[',role_id,']') as role_id"),true);
  9. 支持:getField("concat(userName,'[',id,']') as id",true);
  10. 支持:getField(array("concat(userName,'[',id,']') as id"),true);
  11. =============代码详情======================
  12. publicfunction getField($field, $sepa =null)
  13. {
  14. $options['field']= $field;
  15. $options = $this->_parseOptions($options);
  16. // 判断查询缓存
  17. if(isset($options['cache']))
  18. {
  19. $cache = $options['cache'];
  20. $key = is_string($cache['key'])? $cache['key']: md5($sepa . serialize($options));
  21. $data = S($key,'', $cache);
  22. if(false!== $data)
  23. {
  24. return $data;
  25. }
  26. }
  27. $is_multi =false;// 是否是多字段
  28. $is_fn =false;// 单字段是否是函数
  29. // 改进-begin
  30. if(is_array($field))
  31. {
  32. if(count($field)>1)
  33. {
  34. $is_multi =true;
  35. $_field = $field;
  36. }
  37. else
  38. {
  39. $field = $field[0];
  40. $is_fn = strpos($field,'(');
  41. }
  42. }
  43. else
  44. {
  45. $field = trim($field);
  46. $is_fn = strpos($field,'(');
  47. if(false=== $is_fn && strpos($field,','))
  48. {
  49. $is_multi =true;
  50. $_field = explode(',', $field);
  51. }
  52. }
  53. // 改进-end
  54. // 此处为原代码语句,注释之! $field = trim($field);
  55. // 此处为原代码语句,注释之! if (strpos($field, ',') && false !== $sepa) { // 多字段
  56. if($is_multi &&false!== $sepa)
  57. {
  58. // 多字段
  59. if(!isset($options['limit']))
  60. {
  61. $options['limit']= is_numeric($sepa)? $sepa :'';
  62. }
  63. $resultSet = $this->db->select($options);
  64. if(!empty($resultSet))
  65. {
  66. if(is_string($resultSet))
  67. {
  68. return $resultSet;
  69. }
  70. // 此处为原代码语句,注释之! $_field = explode(',', $field);
  71. $field = array_keys($resultSet[0]);
  72. $key1 = array_shift($field);
  73. $key2 = array_shift($field);
  74. $cols = array();
  75. $count = count($_field);
  76. foreach($resultSet as $result)
  77. {
  78. $name = $result[$key1];
  79. if(2== $count)
  80. {
  81. $cols[$name]= $result[$key2];
  82. }
  83. else
  84. {
  85. $cols[$name]= is_string($sepa)? implode($sepa, array_slice($result,1)): $result;
  86. }
  87. }
  88. if(isset($cache))
  89. {
  90. S($key, $cols, $cache);
  91. }
  92. return $cols;
  93. }
  94. }
  95. else
  96. {
  97. // 查找一条记录
  98. // 返回数据个数
  99. if(true!== $sepa)
  100. {
  101. // 当sepa指定为true的时候 返回所有数据
  102. $options['limit']= is_numeric($sepa)? $sepa :1;
  103. }
  104. $result = $this->db->select($options);
  105. if(!empty($result))
  106. {
  107. if(is_string($result))
  108. {
  109. return $result;
  110. }
  111. if(true!== $sepa &&1== $options['limit'])
  112. {
  113. $data = reset($result[0]);
  114. if(isset($cache))
  115. {
  116. S($key, $data, $cache);
  117. }
  118. return $data;
  119. }
  120. foreach($result as $val)
  121. {
  122. // 此处为原代码语句,注释之! $array[] = $val[$field];
  123. $array[]= $is_fn ? current($val): $val[$field];
  124. }
  125. if(isset($cache))
  126. {
  127. S($key, $array, $cache);
  128. }
  129. return $array;
  130. }
  131. }
  132. returnnull;
  133. }