Common.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. <?php
  2. namespace Heanup\Frame\Package\Database;
  3. /**
  4. * 数据库操作类
  5. * 单表模式
  6. */
  7. class Common extends \Heanup\Frame\Package\Database\Single
  8. {
  9. /**
  10. * 通过ID获取单条记录
  11. *
  12. * @param string $id
  13. * @return array
  14. */
  15. public function getOne($id)
  16. {
  17. return self::getLine($id);
  18. }
  19. /**
  20. * 通过字段条件获取单条记录
  21. *
  22. * @param array $where
  23. * 查询条件
  24. * @param array $fields
  25. * 要获取的字段信息
  26. * @return array
  27. */
  28. public function getOneByField($where = array(), $fields = array())
  29. {
  30. $list = $this->select($fields, $where, '', 1);
  31. return ! empty($list) ? $list[0] : null;
  32. }
  33. /**
  34. * 通过字段条件获取排序后的限制记录
  35. *
  36. * @param array $where
  37. * 查询条件
  38. * @param array $fields
  39. * 要获取的字段信息
  40. * @param int $limit
  41. * 限制记录数
  42. * @param int $offset
  43. * 查询偏移量
  44. * @param array $orderBy
  45. * 排序 array("field1"=>1,"field2"=>0); 0升序1降序
  46. * @return array
  47. */
  48. public function getList($where = array(), $fields = array(), $limit = null, $offset = null, $orderBy = array())
  49. {
  50. return $this->select($fields, $where, '', $limit, $offset, $orderBy);
  51. }
  52. /**
  53. * 复杂语句的计数查询
  54. *
  55. * @param array $where
  56. * @return int
  57. */
  58. public function countByMuti($where = array())
  59. {
  60. $arr = $this->buildWhere($where);
  61. return $this->count($arr['where'], $arr['whereString']);
  62. }
  63. /**
  64. * 复杂的查询语句
  65. *
  66. * @param array $where <br>
  67. * 1.'key'=>$value 等于的查询条件<br>
  68. * 2.'key'=>array( '_logic'=>'比较运算符或like' , 'value'=>$value ) '<','<=','>','>=','!=','LIKE'的查询条件<br>
  69. * 3.'key'=>array($value1,$value2,$value3,...) IN范围查询<br>
  70. * 4.'key'=>array( array( '_logic'=>'比较运算符或like' , 'value'=>$value ) ,'key'=>$value ) 一个字段多个查询条件<br>
  71. * @param array $fields
  72. * @param int $limit
  73. * @param int $offset
  74. * @param array $orderBy
  75. * @return array
  76. */
  77. public function getListByMuti($where = array(), $fields = array(), $limit = null, $offset = null, $orderBy = array())
  78. {
  79. $arr = $this->buildWhere($where);
  80. return $this->select($fields, $arr['where'], $arr['whereString'], $limit, $offset, $orderBy);
  81. }
  82. /**
  83. * 复杂的查询语句
  84. *
  85. * @param array $where <br>
  86. * 1.'key'=>$value 等于的查询条件<br>
  87. * 2.'key'=>array( '_logic'=>'比较运算符或like' , 'value'=>$value ) '<','<=','>','>=','!=','LIKE'的查询条件<br>
  88. * 3.'key'=>array($value1,$value2,$value3,...) IN范围查询<br>
  89. * 4.'key'=>array( array( '_logic'=>'比较运算符或like' , 'value'=>$value ) ,'key'=>$value ) 一个字段多个查询条件<br>
  90. * @param array $fields
  91. * @param int $limit
  92. * @param int $offset
  93. * @param array $orderBy
  94. * @return array
  95. */
  96. public function getAllByMutiple($where = array(), $fields = array(), $orderBy = array(),$limit=null,$offset=null)
  97. {
  98. $arr = $this->buildWhere($where);
  99. return $this->select($fields, $arr['where'], $arr['whereString'], $limit, $offset, $orderBy);
  100. }
  101. /**
  102. * 更新(基于ID)
  103. * @param int $id
  104. * @param array $data
  105. * @return int
  106. */
  107. public function update($id, $data)
  108. {
  109. return parent::update($data, array('id'=>$id));
  110. }
  111. /**
  112. * 复杂的更新语句
  113. *
  114. * @param array $set
  115. * 1.'key'=>$value 等于参数设置
  116. * 2.'key'=>array( '_logic'=>'运算符','value'=>$value ) 含 '+', '-','*','/','%'运算符号的参数设置
  117. * @param array $where
  118. * @return bool|int
  119. */
  120. public function updateByMuti($set = array(), $where = array())
  121. {
  122. $wArr = $this->buildWhere($where);
  123. $sArr = $this->buildSet($set);
  124. $sql = " UPDATE `" . $this->tableName . "` SET " . $sArr['setString'] . ' WHERE ' . $wArr['whereString'];
  125. $prepared = array_merge($wArr['where'], $sArr['set']);
  126. return $this->write($sql, $prepared);
  127. }
  128. /**
  129. * 将复杂的查询条件转换为PDO类可解读的参数绑定方式
  130. *
  131. * @param array $map
  132. * 条件
  133. * $map允许的键值格式(所有的条件是AND组合的):
  134. * 1.'key'=>$value 等于的查询条件
  135. * 2.'key'=>array( '_logic'=>'比较运算符或like' , 'value'=>$value ) '<','<=','>','>=','!=','LIKE'的查询条件
  136. * 3.'key'=>array($value1,$value2,$value3,...) IN范围查询
  137. * 4.'key'=>array( array( '_logic'=>'比较运算符或like' , 'value'=>$value ) ,'key'=>$value ) 一个字段多个查询条件
  138. * @return array
  139. */
  140. public function buildWhere($map)
  141. {
  142. $fhArr = array(
  143. '<',
  144. '<=',
  145. '>',
  146. '>=',
  147. '!=',
  148. 'LIKE'
  149. );
  150. $where = array();
  151. $whereString = array();
  152. foreach ($map as $k => $v) {
  153. if (is_array($v)) {
  154. if (! empty($v['_logic'])) {
  155. $v['_logic'] = strtoupper($v['_logic']);
  156. if (in_array($v['_logic'], $fhArr)) {
  157. $whereString[] = self::escapeKey($k) . ' ' . $v['_logic'] . ' ' . self::replaceKey($k, 'wh_') . '';
  158. $where[self::replaceKey($k, 'wh_')] = $v['value'];
  159. }
  160. } else {
  161. $mixArr = array();
  162. foreach ($v as $ke => $va) {
  163. if (is_array($va)) {
  164. if (! empty($va['_logic'])) {
  165. $va['_logic'] = strtoupper($va['_logic']);
  166. if (in_array($va['_logic'], $fhArr)) {
  167. $whereString[] = self::escapeKey($k) . ' ' . $va['_logic'] . ' ' . self::replaceKey($k . $ke, 'wh_') . '';
  168. $where[self::replaceKey($k . $ke, 'wh_')] = $va['value'];
  169. }
  170. }
  171. } else {
  172. $mixArr[] = $va;
  173. }
  174. }
  175. if (! empty($mixArr)) {
  176. $string = self::escapeKey($k) . ' IN ( ';
  177. $first = '';
  178. foreach ($mixArr as $ke => $va) {
  179. $string .= $first . self::replaceKey($k . $ke, 'wh_');
  180. $where[self::replaceKey($k . $ke, 'wh_')] = $va;
  181. $first = ',';
  182. }
  183. $string .= ' ) ';
  184. $whereString[] = $string;
  185. }
  186. }
  187. } else {
  188. $whereString[] = self::escapeKey($k) . ' = ' . self::replaceKey($k, 'wh_');
  189. $where[self::replaceKey($k, 'wh_')] = $v;
  190. }
  191. }
  192. return array(
  193. 'where' => $where,
  194. 'whereString' => implode(' AND ', $whereString)
  195. );
  196. }
  197. /**
  198. * 将复杂的更新条件转换为PDO类可解读的参数绑定方式
  199. *
  200. * @param array $map
  201. * 参数设置
  202. * $map设置参数的格式:
  203. * 1.'key'=>$value 等于参数设置
  204. * 2.'key'=>array( '_logic'=>'运算符','value'=>$value ) 含 '+', '-','*','/','%'运算符号的参数设置
  205. * @return array()
  206. */
  207. public function buildSet($map)
  208. {
  209. if (! is_array($map) || empty($map)) {
  210. return '';
  211. }
  212. $setString = array();
  213. $set = array();
  214. foreach ($map as $k => $v) {
  215. if (is_array($v)) {
  216. if (! empty($v['_logic'])) {
  217. if (in_array($v['_logic'], array(
  218. '+',
  219. '-',
  220. '*',
  221. '/',
  222. '%'
  223. ))) {
  224. $setString[] = self::escapeKey($k) . ' = ' . self::escapeKey($k) . ' ' . $v['_logic'] . ' ' . self::replaceKey($k, 'st_');
  225. $set[self::replaceKey($k, 'st_')] = $v['value'];
  226. }
  227. }
  228. } else {
  229. $setString[] = self::escapeKey($k) . '=' . self::replaceKey($k, 'st_');
  230. $set[self::replaceKey($k, 'st_')] = $v;
  231. }
  232. }
  233. return array(
  234. 'set' => $set,
  235. 'setString' => implode(' , ', $setString)
  236. );
  237. }
  238. /**
  239. * 安全过滤key
  240. *
  241. * @param string $key
  242. * @return string
  243. */
  244. protected function escapeKey($key)
  245. {
  246. $key = str_replace(array(
  247. '`',
  248. ' '
  249. ), '', $key);
  250. return ' `' . addslashes(stripslashes($key)) . '` ';
  251. }
  252. /**
  253. * 参数绑定value
  254. *
  255. * @param string $key
  256. * @return string
  257. */
  258. protected function replaceKey($key, $prefix = '')
  259. {
  260. return ':' . $prefix . $key;
  261. }
  262. }