W7Connection.php 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK ]
  4. // +----------------------------------------------------------------------
  5. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  6. // +----------------------------------------------------------------------
  7. // | Author: liu21st <liu21st@gmail.com>
  8. // +----------------------------------------------------------------------
  9. namespace think\db;
  10. use PDO;
  11. use think\Container;
  12. use think\Db;
  13. use think\db\Connection as BaseConnection;
  14. use think\db\exception\BindParamException;
  15. use think\db\exception\DataNotFoundException;
  16. use think\db\exception\ModelNotFoundException;
  17. use think\db\Query;
  18. use think\exception\DbException;
  19. use think\exception\PDOException;
  20. use think\Model;
  21. /**
  22. * Oracle数据库驱动
  23. */
  24. class W7Connection extends BaseConnection
  25. {
  26. protected $builderClassName = '\\think\\db\\Builder';
  27. /**
  28. * 解析pdo连接的dsn信息
  29. * @access protected
  30. * @param array $config 连接信息
  31. * @return string
  32. */
  33. protected function parseDsn($config)
  34. {
  35. $dsn = 'oci:dbname=';
  36. if (!empty($config['hostname'])) {
  37. // Oracle Instant Client
  38. $dsn .= '//' . $config['hostname'] . ($config['hostport'] ? ':' . $config['hostport'] : '') . '/';
  39. }
  40. $dsn .= $config['database'];
  41. if (!empty($config['charset'])) {
  42. $dsn .= ';charset=' . $config['charset'];
  43. }
  44. return $dsn;
  45. }
  46. /**
  47. * 取得数据表的字段信息
  48. * @access public
  49. * @param string $tableName
  50. * @return array
  51. */
  52. public function getFields($tableName)
  53. {
  54. $this->initConnect(true);
  55. list($tableName) = explode(' ', $tableName);
  56. $sql = "select a.column_name,data_type,DECODE (nullable, 'Y', 0, 1) notnull,data_default, DECODE (A .column_name,b.column_name,1,0) pk from all_tab_columns a,(select column_name from all_constraints c, all_cons_columns col where c.constraint_name = col.constraint_name and c.constraint_type = 'P' and c.table_name = '" . strtoupper($tableName) . "' ) b where table_name = '" . strtoupper($tableName) . "' and a.column_name = b.column_name (+)";
  57. $pdo = $this->linkID->query($sql);
  58. $result = $pdo->fetchAll(PDO::FETCH_ASSOC);
  59. $info = [];
  60. if ($result) {
  61. foreach ($result as $key => $val) {
  62. $val = array_change_key_case($val);
  63. $info[$val['column_name']] = [
  64. 'name' => $val['column_name'],
  65. 'type' => $val['data_type'],
  66. 'notnull' => $val['notnull'],
  67. 'default' => $val['data_default'],
  68. 'primary' => $val['pk'],
  69. 'autoinc' => $val['pk'],
  70. ];
  71. }
  72. }
  73. return $this->fieldCase($info);
  74. }
  75. /**
  76. * 取得数据库的表信息(暂时实现取得用户表信息)
  77. * @access public
  78. * @param string $dbName
  79. * @return array
  80. */
  81. public function getTables($dbName = '')
  82. {
  83. $pdo = $this->linkID->query("select table_name from all_tables");
  84. $result = $pdo->fetchAll(PDO::FETCH_ASSOC);
  85. $info = [];
  86. foreach ($result as $key => $val) {
  87. $info[$key] = current($val);
  88. }
  89. return $info;
  90. }
  91. /**
  92. * 获取最近插入的ID
  93. * @access public
  94. * @param string $sequence 自增序列名
  95. * @return string
  96. */
  97. public function getLastInsID($sequence = null)
  98. {
  99. return '';
  100. if(!$sequence){
  101. return '';
  102. }
  103. $pdo = $this->linkID->query("select {$sequence}.currval as id from dual");
  104. $result = $pdo->fetchColumn();
  105. return $result;
  106. }
  107. /**
  108. * SQL性能分析
  109. * @access protected
  110. * @param string $sql
  111. * @return array
  112. */
  113. protected function getExplain($sql)
  114. {
  115. return [];
  116. }
  117. protected function supportSavepoint()
  118. {
  119. return true;
  120. }
  121. /**
  122. * 插入记录
  123. * @access public
  124. * @param Query $query 查询对象
  125. * @param boolean $replace 是否replace
  126. * @param boolean $getLastInsID 返回自增主键
  127. * @param string $sequence 自增序列名
  128. * @return integer|string
  129. */
  130. public function insert(Query $query, $replace = false, $getLastInsID = false, $sequence = null)
  131. {
  132. // 分析查询表达式
  133. $options = $query->getOptions();
  134. // 生成SQL语句
  135. $sql = $this->builder->insert($query, $replace);
  136. $bind = $query->getBind();
  137. if (!empty($options['fetch_sql'])) {
  138. // 获取实际执行的SQL语句
  139. return $this->getRealSql($sql, $bind);
  140. }
  141. // 执行操作
  142. $result = '' == $sql ? 0 : $this->execute($sql, $bind, $query);
  143. if ($result) {
  144. $sequence = $sequence ?: (isset($options['sequence']) ? $options['sequence'] : 'SEQ_'.$options['table']);
  145. $lastInsId = $this->getLastInsID($sequence);
  146. $data = $options['data'];
  147. if ($lastInsId) {
  148. $pk = $query->getPk($options);
  149. if (is_string($pk)) {
  150. $data[$pk] = $lastInsId;
  151. }
  152. }
  153. $query->setOption('data', $data);
  154. $query->trigger('after_insert');
  155. if ($getLastInsID) {
  156. return $lastInsId;
  157. }
  158. }
  159. return $result;
  160. }
  161. /**
  162. * 得到某个列的数组
  163. * @access public
  164. * @param Query $query 查询对象
  165. * @param string $field 字段名 多个字段用逗号分隔
  166. * @param string $key 索引
  167. * @return array
  168. */
  169. public function column(Query $query, $field, $key = '')
  170. {
  171. $options = $query->getOptions();
  172. if (isset($options['field'])) {
  173. $query->removeOption('field');
  174. }
  175. if (is_null($field)) {
  176. $field = ['*'];
  177. } elseif (is_string($field)) {
  178. $field = array_map('trim', explode(',', $field));
  179. }
  180. if ($key && ['*'] != $field) {
  181. array_unshift($field, $key);
  182. $field = array_unique($field);
  183. }
  184. $query->setOption('field', $field);
  185. if (empty($options['fetch_sql']) && !empty($options['cache'])) {
  186. // 判断查询缓存
  187. $cache = $options['cache'];
  188. $result = $this->getCacheData($query, $cache, null, $guid);
  189. if (false !== $result) {
  190. return $result;
  191. }
  192. }
  193. // 生成查询SQL
  194. $sql = $this->builder->select($query);
  195. // 还原field参数
  196. if (isset($options['field'])) {
  197. $query->setOption('field', $options['field']);
  198. } else {
  199. $query->removeOption('field');
  200. }
  201. $bind = $query->getBind();
  202. if (!empty($options['fetch_sql'])) {
  203. // 获取实际执行的SQL语句
  204. return $this->getRealSql($sql, $bind);
  205. }
  206. // 执行查询操作
  207. $pdo = $this->query($sql, $bind, $options['master'], true);
  208. if (1 == $pdo->columnCount()) {
  209. $result = $pdo->fetchAll(PDO::FETCH_COLUMN);
  210. } else {
  211. $resultSet = $pdo->fetchAll(PDO::FETCH_ASSOC);
  212. if (['*'] == $field && $key) {
  213. $result = array_column($resultSet, null, $key);
  214. } elseif ($resultSet) {
  215. $fields = array_keys($resultSet[0]);
  216. $count = count($fields);
  217. $key1 = array_shift($fields);
  218. $key2 = $fields ? array_shift($fields) : '';
  219. $key = $key ?: $key1;
  220. if (strpos($key, '.')) {
  221. list($alias, $key) = explode('.', $key);
  222. }
  223. if (2 == $count) {
  224. $column = $key2;
  225. } elseif (1 == $count) {
  226. $column = $key1;
  227. } else {
  228. $column = null;
  229. }
  230. $result = array_column($resultSet, $column, $key);
  231. } else {
  232. $result = [];
  233. }
  234. }
  235. $result = $this->formatColumnFieldType($field, $result);
  236. $result = $this->formatColumnField($field, $result);
  237. $result = $this->formatFieldUpper($result, $field);
  238. if (isset($cache) && isset($guid)) {
  239. // 缓存数据
  240. $this->cacheData($guid, $result, $cache);
  241. }
  242. return $result;
  243. }
  244. /**
  245. * 查找记录
  246. * @access public
  247. * @param Query $query 查询对象
  248. * @return array|\PDOStatement|string
  249. * @throws DbException
  250. * @throws ModelNotFoundException
  251. * @throws DataNotFoundException
  252. */
  253. public function select(Query $query)
  254. {
  255. // 分析查询表达式
  256. $options = $query->getOptions();
  257. if (empty($options['fetch_sql']) && !empty($options['cache'])) {
  258. $resultSet = $this->getCacheData($query, $options['cache'], null, $key);
  259. if (false !== $resultSet) {
  260. return $resultSet;
  261. }
  262. }
  263. // 生成查询SQL
  264. $sql = $this->builder->select($query);
  265. $query->removeOption('limit');
  266. $bind = $query->getBind();
  267. if (!empty($options['fetch_sql'])) {
  268. // 获取实际执行的SQL语句
  269. return $this->getRealSql($sql, $bind);
  270. }
  271. $resultSet = $query->trigger('before_select');
  272. if (!$resultSet) {
  273. // 执行查询操作
  274. $resultSet = $this->query($sql, $bind, $options['master'], $options['fetch_pdo']);
  275. if ($resultSet instanceof \PDOStatement) {
  276. // 返回PDOStatement对象
  277. return $resultSet;
  278. }
  279. }
  280. $resultSet = $this->formatFieldUpper($resultSet, $options['field']);
  281. $resultSet = $this->formatColumnFieldType($options['field'], $resultSet);
  282. if (!empty($options['cache']) && false !== $resultSet) {
  283. // 缓存数据集
  284. $this->cacheData($key, $resultSet, $options['cache']);
  285. }
  286. return $resultSet;
  287. }
  288. /**
  289. * 执行查询 返回数据集
  290. * @access public
  291. * @param string $sql sql指令
  292. * @param array $bind 参数绑定
  293. * @param bool $master 是否在主服务器读操作
  294. * @param bool $pdo 是否返回PDO对象
  295. * @return array
  296. * @throws BindParamException
  297. * @throws \PDOException
  298. * @throws \Exception
  299. * @throws \Throwable
  300. */
  301. public function query($sql, $bind = [], $master = false, $pdo = false)
  302. {
  303. $this->initConnect($master);
  304. if (!$this->linkID) {
  305. return false;
  306. }
  307. // 记录SQL语句
  308. $this->queryStr = $sql;
  309. $this->bind = $bind;
  310. Db::$queryTimes++;
  311. try {
  312. // 调试开始
  313. $this->debug(true);
  314. // 预处理
  315. $this->PDOStatement = $this->linkID->prepare($sql);
  316. // 是否为存储过程调用
  317. $procedure = in_array(strtolower(substr(trim($sql), 0, 4)), ['call', 'exec']);
  318. // 参数绑定
  319. if ($procedure) {
  320. $this->bindParam($bind);
  321. } else {
  322. $this->bindValue($bind);
  323. }
  324. // 执行查询
  325. $this->PDOStatement->execute();
  326. // 调试结束
  327. $this->debug(false, '', $master);
  328. // 返回结果集
  329. return $this->getResult($pdo, $procedure);
  330. } catch (\PDOException $e) {
  331. if ($this->isBreak($e)) {
  332. return $this->close()->query($sql, $bind, $master, $pdo);
  333. }
  334. throw new PDOException($e, $this->config, $this->getLastsql());
  335. } catch (\Throwable $e) {
  336. if ($this->isBreak($e)) {
  337. return $this->close()->query($sql, $bind, $master, $pdo);
  338. }
  339. throw $e;
  340. } catch (\Exception $e) {
  341. if ($this->isBreak($e)) {
  342. return $this->close()->query($sql, $bind, $master, $pdo);
  343. }
  344. throw $e;
  345. }
  346. }
  347. /**
  348. * 查找单条记录
  349. * @access public
  350. * @param Query $query 查询对象
  351. * @return array|null|\PDOStatement|string
  352. * @throws DbException
  353. * @throws ModelNotFoundException
  354. * @throws DataNotFoundException
  355. */
  356. public function find(Query $query)
  357. {
  358. // 分析查询表达式
  359. $options = $query->getOptions();
  360. $pk = $query->getPk($options);
  361. $data = $options['data'];
  362. $query->setOption('limit', 1);
  363. if (empty($options['fetch_sql']) && !empty($options['cache'])) {
  364. // 判断查询缓存
  365. $cache = $options['cache'];
  366. if (is_string($cache['key'])) {
  367. $key = $cache['key'];
  368. } else {
  369. $key = $this->getCacheKey($query, $data);
  370. }
  371. $result = Container::get('cache')->get($key);
  372. if (false !== $result) {
  373. return $result;
  374. }
  375. }
  376. if (is_string($pk) && !is_array($data)) {
  377. if (isset($key) && strpos($key, '|')) {
  378. list($a, $val) = explode('|', $key);
  379. $item[$pk] = $val;
  380. } else {
  381. $item[$pk] = $data;
  382. }
  383. $data = $item;
  384. }
  385. $query->setOption('data', $data);
  386. // 生成查询SQL
  387. $sql = $this->builder->select($query);
  388. $query->removeOption('limit');
  389. $bind = $query->getBind();
  390. if (!empty($options['fetch_sql'])) {
  391. // 获取实际执行的SQL语句
  392. return $this->getRealSql($sql, $bind);
  393. }
  394. // 事件回调
  395. $result = $query->trigger('before_find');
  396. if (!$result) {
  397. // 执行查询
  398. $resultSet = $this->query($sql, $bind, $options['master'], $options['fetch_pdo']);
  399. if ($resultSet instanceof \PDOStatement) {
  400. // 返回PDOStatement对象
  401. return $resultSet;
  402. }
  403. $result = isset($resultSet[0]) ? $resultSet[0] : null;
  404. }
  405. if (isset($cache) && $result) {
  406. // 缓存数据
  407. $this->cacheData($key, $result, $cache);
  408. }
  409. return $this->formatFieldUpper($result, $options['field']);
  410. // return $result;
  411. }
  412. /**
  413. * 数据number类型转换
  414. * @param $column_field
  415. * @param $column
  416. * @return array|mixed
  417. */
  418. protected function formatColumnFieldType($column_field, $column)
  419. {
  420. // number类型字段配置
  421. $fields = [
  422. 'CSDD_DDZT' => 'integer',
  423. 'CSDDCS_DCSL' => 'integer',
  424. 'DDDM_PDM' => 'integer',
  425. 'DDDM_DM' => 'integer',
  426. 'DDDM_LX' => 'integer',
  427. 'LJTDD_DDZT' => 'integer',
  428. 'SYZYDD_DDZT' => 'integer',
  429. 'XDDD_DDZT' => 'integer',
  430. 'XDMS_DM' => 'integer',
  431. 'XDZL_DM' => 'integer',
  432. 'YDJL_LX' => 'integer',
  433. 'YDXX_YDLX' => 'integer',
  434. 'YDXX_YDZT' => 'integer',
  435. 'YJDDD_DDZT' => 'integer',
  436. 'YPYSDD_DDZT' => 'integer',
  437. 'MZXX_HY' => 'integer',
  438. 'QYXX_YXBS' => 'integer',
  439. 'SYXX_ZT' => 'integer',
  440. 'SYXX_RYLX' => 'integer',
  441. 'SYXX_YXBS' => 'integer',
  442. 'CSLB_CSSJSJ' => 'integer',
  443. 'CSLB_CSSJZT' => 'integer',
  444. 'CSLB_LXJGSJ' => 'integer',
  445. 'CSLB_CJ' => 'integer',
  446. 'CSLB_PX' => 'integer',
  447. 'CSSJCS_SJXX' => 'integer',
  448. 'CSSJCS_SJSX' => 'integer',
  449. 'CSSJCS_SFXS' => 'integer',
  450. 'CSSJCS_PX' => 'integer',
  451. 'HKSJ_CSSJ' => 'integer',
  452. 'HKSJ_SJZT' => 'integer',
  453. 'HSJJD_HSRS' => 'integer',
  454. 'HSJJD_ZT' => 'integer',
  455. 'HSJJD_YXBS' => 'integer',
  456. 'JCBG_ZT' => 'integer',
  457. 'JCBG_YYX' => 'integer',
  458. 'JCBG_YXBS' => 'integer',
  459. 'JCBW_SXH' => 'integer',
  460. 'JCBW_ZT' => 'integer',
  461. 'JCBW_YXBS' => 'integer',
  462. 'JCMB_YXBS' => 'integer',
  463. 'JCMB_SXH' => 'integer',
  464. 'JCMB_MBLX' => 'integer',
  465. 'JCMBBW_SXH' => 'integer',
  466. 'JCXM_YXBS' => 'integer',
  467. 'JCXX_SFJJ' => 'integer',
  468. 'JCXX_ZT' => 'integer',
  469. 'JCXX_YXBS' => 'integer',
  470. 'JCXXXQ_YXBS' => 'integer',
  471. 'SRXX_SFJJ' => 'integer',
  472. 'SRXX_ZT' => 'integer',
  473. 'JYXM_ZBLX' => 'integer',
  474. 'JYXM_LX' => 'integer',
  475. 'JYXMMX_ZBLX' => 'integer',
  476. 'JYXX_YXBS' => 'integer',
  477. 'JYXXMX_TCLX' => 'integer',
  478. 'JYXXMX_JJ' => 'integer',
  479. 'JYXXMX_CQ' => 'integer',
  480. 'JYXXMX_ZT' => 'integer',
  481. 'JYXXMX_YXBS' => 'integer',
  482. 'JYYQ_ZT' => 'integer',
  483. 'JYYQ_LX' => 'integer',
  484. 'JYZB_PX' => 'integer',
  485. 'JYZB_LX' => 'integer',
  486. 'TBJL_LX' => 'integer',
  487. 'TC_LX' => 'integer',
  488. 'TC_ZT' => 'integer',
  489. 'TC_PX' => 'integer',
  490. 'TXM_ZT' => 'integer',
  491. 'MZJBXX_HY' => 'integer',
  492. 'MZJBXX_ZT' => 'integer',
  493. 'MZJBXX_YSBS' => 'integer',
  494. 'SPXX_DRLY' => 'integer',
  495. 'SPXX_RYLB' => 'integer',
  496. 'SPXX_DQJGLX' => 'integer',
  497. 'MZQYY_YXBS' => 'integer',
  498. 'MZSJL_YXBS' => 'integer',
  499. 'SHZD_YXBS' => 'integer',
  500. 'SQZD_YXBS' => 'integer',
  501. 'SSMC_SXH' => 'integer',
  502. 'SSMC_YXBS' => 'integer',
  503. 'SSMCYY_SSYY' => 'integer',
  504. 'SSMCYY_YXBS' => 'integer',
  505. 'SSQX_ZT' => 'integer',
  506. 'SSS_KKZSS' => 'integer',
  507. 'SSS_YKZSS' => 'integer',
  508. 'SSS_YXBS' => 'integer',
  509. 'SSXQ_YXBS' => 'integer',
  510. 'SSXQ_XXZT' => 'integer',
  511. 'id' => 'integer',
  512. 'TWMB_SBHTS' => 'integer',
  513. 'XXTZ_JGID' => 'integer',
  514. 'XXTZ_ZT' => 'integer',
  515. 'XXTZ_JJCD' => 'integer',
  516. 'KFXX_ZSKF' => 'integer',
  517. 'KFXX_ZT' => 'integer',
  518. 'WZCK_YXBS' => 'integer',
  519. 'WZCKMX_BZWZ' => 'integer',
  520. 'WZCKMX_WZCKSL' => 'integer',
  521. 'WZCKMX_YXBS' => 'integer',
  522. 'WZKC_BZWZ' => 'integer',
  523. 'WZKC_KCSL' => 'integer',
  524. 'WZKC_YXBS' => 'integer',
  525. 'WZPD_YXBS' => 'integer',
  526. 'WZPDMX_PDQSL' => 'integer',
  527. 'WZPDMX_PDHSL' => 'integer',
  528. 'WZPDMX_YXBS' => 'integer',
  529. 'WZRK_YXBS' => 'integer',
  530. 'WZRKMX_BZWZ' => 'integer',
  531. 'WZRKMX_WZRKSL' => 'integer',
  532. 'WZRKMX_YXBS' => 'integer',
  533. 'WZZD_BZWZ' => 'integer',
  534. 'WZZD_YXBS' => 'integer',
  535. 'BCXX_SXH' => 'integer',
  536. 'BCXX_ZT' => 'integer',
  537. 'BCXX_YXBS' => 'integer',
  538. 'BFXX_SXH' => 'integer',
  539. 'BFXX_YXBS' => 'integer',
  540. 'BISBJL_SBJGID' => 'integer',
  541. 'CSXX_SL' => 'integer',
  542. 'CSXX_ZT' => 'integer',
  543. 'CYXX_ZT' => 'integer',
  544. 'CYXX_YXBS' => 'integer',
  545. 'GDXX_ZT' => 'integer',
  546. 'GDXX_YXBS' => 'integer',
  547. 'HSXX_QZHS' => 'integer',
  548. 'HSXX_ZT' => 'integer',
  549. 'HSXX_YXBS' => 'integer',
  550. 'JGSJDW_ZT' => 'integer',
  551. 'JGXX_PZ_ZLK' => 'integer',
  552. 'JGXX_PZ_SYLBSXSJ' => 'integer',
  553. 'JGXX_ZT' => 'integer',
  554. 'JGXX_SFCSH' => 'integer',
  555. 'JGXX_JGMS' => 'integer',
  556. 'LSBL_YXBS' => 'integer',
  557. 'RWLX_SXH' => 'integer',
  558. 'SBQCZ_YXBS' => 'integer',
  559. 'SBQZD_LX' => 'integer',
  560. 'SBQZD_YXBS' => 'integer',
  561. 'SHXX_LX' => 'integer',
  562. 'SHXX_ZT' => 'integer',
  563. 'SHXX_YXBS' => 'integer',
  564. 'SJSBDZ_ZT' => 'integer',
  565. 'SJSBJL_LX' => 'integer',
  566. 'SPXX_YXBS' => 'integer',
  567. 'SSXX_ZT' => 'integer',
  568. 'SSXX_YXBS' => 'integer',
  569. 'SSXXXQ_YXBS' => 'integer',
  570. 'SSYYXQ_SSYL' => 'integer',
  571. 'SWXX_ZT' => 'integer',
  572. 'SWXX_YXBS' => 'integer',
  573. 'SYJBXX_DRLY' => 'integer',
  574. 'SYZLXX_RYLB' => 'integer',
  575. 'SYZLXX_DQJGLX' => 'integer',
  576. 'SYZLXX_YXBS' => 'integer',
  577. 'WQFDRWMB_XXL' => 'integer',
  578. 'WQFDRWMB_CBL' => 'integer',
  579. 'WQFDXX_YXBS' => 'integer',
  580. 'WQJSFA_XXL' => 'integer',
  581. 'WQJSFA_CBL' => 'integer',
  582. 'WQJSFA_SXH' => 'integer',
  583. 'WQJSXX_YXJ' => 'integer',
  584. 'WQJSXX_SXH' => 'integer',
  585. 'WQJSXX_YXBS' => 'integer',
  586. 'WQJSYPMB_BZYL' => 'integer',
  587. 'WQRWXX_LX' => 'integer',
  588. 'WQRWXX_LB' => 'integer',
  589. 'WQYPFA_BZYL' => 'integer',
  590. 'WQYPFA_SXH' => 'integer',
  591. 'YFXX_ZSYF' => 'integer',
  592. 'YFXX_ZT' => 'integer',
  593. 'YGXX_ID' => 'integer',
  594. 'YGXX_LX' => 'integer',
  595. 'YGXX_JSXH' => 'integer',
  596. 'YGXX_YXBS' => 'integer',
  597. 'YGXX_JCYG' => 'integer',
  598. 'YJDXX_SL' => 'integer',
  599. 'YJDXX_ZT' => 'integer',
  600. 'ZSXX_LX' => 'integer',
  601. 'ZSXX_ZT' => 'integer',
  602. 'ZSXX_CZ' => 'integer',
  603. 'ZSXX_PZ' => 'integer',
  604. 'ZSXX_PX' => 'integer',
  605. 'JSKCBZ_ZT' => 'integer',
  606. 'JSRKXQ_XXL' => 'integer',
  607. 'JSRKXQ_CBL' => 'integer',
  608. 'JSRKYPXQ_RKSL' => 'integer',
  609. 'JSSQXQ_XXL' => 'integer',
  610. 'JSSQXQ_CBL' => 'integer',
  611. 'JSSQYPXQ_RKSL' => 'integer',
  612. 'RKJL_HSXS' => 'integer',
  613. 'RKJL_RKSL' => 'integer',
  614. 'YPCK_ZT' => 'integer',
  615. 'YPCK_YXBS' => 'integer',
  616. 'YPCKMX_YPHSXS' => 'integer',
  617. 'YPCKMX_YPCKDWLX' => 'integer',
  618. 'YPCKMX_YPDCKSL' => 'integer',
  619. 'YPCKMX_YPCKSL' => 'integer',
  620. 'YPCKMX_YXBS' => 'integer',
  621. 'YPFF_YXBS' => 'integer',
  622. 'YPFFMX_YPHSXS' => 'integer',
  623. 'YPFFMX_YPFFDWLX' => 'integer',
  624. 'YPFFMX_YPFFSL' => 'integer',
  625. 'YPFFMX_YXBS' => 'integer',
  626. 'YPJSCK_YXBS' => 'integer',
  627. 'YPJSCKMX_JSCKSL' => 'integer',
  628. 'YPJSCKMX_YXBS' => 'integer',
  629. 'YPJSPD_YXBS' => 'integer',
  630. 'YPJSPDMX_PDQSL' => 'integer',
  631. 'YPJSPDMX_PDHSL' => 'integer',
  632. 'YPJSPDMX_YXBS' => 'integer',
  633. 'YPKC_DMYP' => 'integer',
  634. 'YPKC_HSXS' => 'integer',
  635. 'YPKC_KCSL' => 'integer',
  636. 'YPKC_YJZSX' => 'integer',
  637. 'YPKC_YJZXX' => 'integer',
  638. 'YPKC_KCLX' => 'integer',
  639. 'YPKC_YXBS' => 'integer',
  640. 'YPPD_YXBS' => 'integer',
  641. 'YPPDMX_PDQSL' => 'integer',
  642. 'YPPDMX_PDHSL' => 'integer',
  643. 'YPPDMX_YXBS' => 'integer',
  644. 'YPQL_ZT' => 'integer',
  645. 'YPQL_YXBS' => 'integer',
  646. 'YPQL_DDZT' => 'integer',
  647. 'YPQLMX_YPHSXS' => 'integer',
  648. 'YPQLMX_YPQLDWLX' => 'integer',
  649. 'YPQLMX_YPQLSL' => 'integer',
  650. 'YPQLMX_YPCKSL' => 'integer',
  651. 'YPQLMX_YPHYSL' => 'integer',
  652. 'YPQLMX_YXBS' => 'integer',
  653. 'YPRK_YXBS' => 'integer',
  654. 'YPRKMX_YPHSXS' => 'integer',
  655. 'YPRKMX_YPRKDWLX' => 'integer',
  656. 'YPRKMX_YPRKSL' => 'integer',
  657. 'YPRKMX_YXBS' => 'integer',
  658. 'YPSJSQ_LX' => 'integer',
  659. 'YPSJSQ_YXBS' => 'integer',
  660. 'YPSJSQMX_YPHSXS' => 'integer',
  661. 'YPSJSQMX_YPSJSQDWLX' => 'integer',
  662. 'YPSJSQMX_YPSJSQSL' => 'integer',
  663. 'YPSJSQMX_YXBS' => 'integer',
  664. 'YPZD_JSYC' => 'integer',
  665. 'YPZD_DMYP' => 'integer',
  666. 'YPZD_XY' => 'integer',
  667. 'YPZD_HSXS' => 'integer',
  668. 'YPZD_ZT' => 'integer',
  669. 'YPZD_PXH' => 'integer',
  670. 'YZXX_LB' => 'integer',
  671. 'YZXX_LX' => 'integer',
  672. 'YZXX_YL' => 'integer',
  673. 'YZXX_TS' => 'integer',
  674. 'YZXX_ZT' => 'integer',
  675. 'YZXX_YXBS' => 'integer',
  676. 'ZXJL_YXBS' => 'integer',
  677. 'BB_YXBS' => 'integer',
  678. 'BB_SXH' => 'integer',
  679. 'CSBW_YXBS' => 'integer',
  680. 'CSBW_SXH' => 'integer',
  681. 'CSZL_SXH' => 'integer',
  682. 'CSZL_ZT' => 'integer',
  683. 'CSZL_YXBS' => 'integer',
  684. 'CZFS_YXBS' => 'integer',
  685. 'CZFS_SXH' => 'integer',
  686. 'FSDD_YXBS' => 'integer',
  687. 'FSDD_SXH' => 'integer',
  688. 'FYXXLX_YXBS' => 'integer',
  689. 'FYXXLX_SXH' => 'integer',
  690. 'GMS_SXH' => 'integer',
  691. 'GMS_YXBS' => 'integer',
  692. 'HLXM_YXBS' => 'integer',
  693. 'HLXM_SXH' => 'integer',
  694. 'HSDD_YXBS' => 'integer',
  695. 'HSDD_SXH' => 'integer',
  696. 'HSGJ_YXBS' => 'integer',
  697. 'HSGJ_SXH' => 'integer',
  698. 'HSJPXYQ_YXBS' => 'integer',
  699. 'HSJPXYQ_SXH' => 'integer',
  700. 'HSTW_YXBS' => 'integer',
  701. 'HSTW_SXH' => 'integer',
  702. 'HSZT_YXBS' => 'integer',
  703. 'HSZT_SXH' => 'integer',
  704. 'HY_YHYS' => 'integer',
  705. 'HY_SXH' => 'integer',
  706. 'JJSS_YXBS' => 'integer',
  707. 'JJSS_SXH' => 'integer',
  708. 'JJYP_YXBS' => 'integer',
  709. 'JJYP_SXH' => 'integer',
  710. 'JWS_SXH' => 'integer',
  711. 'JWS_YXBS' => 'integer',
  712. 'JX_YXBS' => 'integer',
  713. 'JX_SXH' => 'integer',
  714. 'JY_SXH' => 'integer',
  715. 'JY_YJY' => 'integer',
  716. 'JZ_YXBS' => 'integer',
  717. 'JZ_SXH' => 'integer',
  718. 'JZCZ_YXBS' => 'integer',
  719. 'JZCZ_SXH' => 'integer',
  720. 'JZS_SXH' => 'integer',
  721. 'JZS_YXBS' => 'integer',
  722. 'JZYCZ_YXBS' => 'integer',
  723. 'JZYCZ_SXH' => 'integer',
  724. 'MZ_YXBS' => 'integer',
  725. 'MZ_SXH' => 'integer',
  726. 'MZBFZ_SXH' => 'integer',
  727. 'MZBFZ_YXBS' => 'integer',
  728. 'MZFF_YXBS' => 'integer',
  729. 'MZFF_SXH' => 'integer',
  730. 'QJFS_YXBS' => 'integer',
  731. 'QJFS_SXH' => 'integer',
  732. 'RYLB_YXBS' => 'integer',
  733. 'RYLB_SXH' => 'integer',
  734. 'RYZD_YXBS' => 'integer',
  735. 'RYZD_SXH' => 'integer',
  736. 'SB_YXBS' => 'integer',
  737. 'SB_SXH' => 'integer',
  738. 'SBQCZ_SXH' => 'integer',
  739. 'SHHM_YXBS' => 'integer',
  740. 'SHHM_SXH' => 'integer',
  741. 'SHLB_YXBS' => 'integer',
  742. 'SHLB_SXH' => 'integer',
  743. 'SQLB_YXBS' => 'integer',
  744. 'SQLB_SXH' => 'integer',
  745. 'SS_YXBS' => 'integer',
  746. 'SS_SXH' => 'integer',
  747. 'SSZL_YXBS' => 'integer',
  748. 'SSZL_SXH' => 'integer',
  749. 'SZ_YXBS' => 'integer',
  750. 'SZ_SXH' => 'integer',
  751. 'SZSJ_SXH' => 'integer',
  752. 'SZSJ_YSZSJ' => 'integer',
  753. 'TZ_SXH' => 'integer',
  754. 'TZFX_YXBS' => 'integer',
  755. 'TZFX_SXH' => 'integer',
  756. 'TZHLYQ_SXH' => 'integer',
  757. 'TZHLYQ_YXBS' => 'integer',
  758. 'TZZD_YXBS' => 'integer',
  759. 'WZCKFS_YXBS' => 'integer',
  760. 'WZCKFS_SXH' => 'integer',
  761. 'XB_YXBS' => 'integer',
  762. 'XB_SXH' => 'integer',
  763. 'XBS_SXH' => 'integer',
  764. 'XBS_YXBS' => 'integer',
  765. 'XKDJ_YXBS' => 'integer',
  766. 'XKDJ_SXH' => 'integer',
  767. 'XKYY_YXBS' => 'integer',
  768. 'XKYY_SXH' => 'integer',
  769. 'XX_YXBS' => 'integer',
  770. 'XX_SXH' => 'integer',
  771. 'XXQW_YXBS' => 'integer',
  772. 'XXQW_SXH' => 'integer',
  773. 'YJCZ_YXBS' => 'integer',
  774. 'YJCZ_SXH' => 'integer',
  775. 'YJS_SXH' => 'integer',
  776. 'YJS_YXBS' => 'integer',
  777. 'YPBM_YXBS' => 'integer',
  778. 'YPCKFS_YXBS' => 'integer',
  779. 'YPCKFS_SXH' => 'integer',
  780. 'YPDS_SXH' => 'integer',
  781. 'YPDS_ZT' => 'integer',
  782. 'YPDS_YXBS' => 'integer',
  783. 'YPDW_ZT' => 'integer',
  784. 'YPDW_YXBS' => 'integer',
  785. 'YPJX_ZT' => 'integer',
  786. 'YPJX_YXBS' => 'integer',
  787. 'YPLB_SXH' => 'integer',
  788. 'YPLB_ZT' => 'integer',
  789. 'YPLB_YXBS' => 'integer',
  790. 'YPLX_SXH' => 'integer',
  791. 'YPLX_ZT' => 'integer',
  792. 'YPLX_YXBS' => 'integer',
  793. 'YPPL_SXH' => 'integer',
  794. 'YPPL_ZT' => 'integer',
  795. 'YPPL_YXBS' => 'integer',
  796. 'YPRKFS_YXBS' => 'integer',
  797. 'YPRKFS_SXH' => 'integer',
  798. 'YPSQZT_YXBS' => 'integer',
  799. 'YPSQZT_SXH' => 'integer',
  800. 'YPYF_SXH' => 'integer',
  801. 'YPYF_ZT' => 'integer',
  802. 'YPYF_YXBS' => 'integer',
  803. 'YXCL_YXBS' => 'integer',
  804. 'YXCL_SXH' => 'integer',
  805. 'YYTJ_YXBS' => 'integer',
  806. 'YYTJ_SXH' => 'integer',
  807. 'YZTC_YXBS' => 'integer',
  808. 'YZTC_SXH' => 'integer',
  809. 'YZTCXQ_LX' => 'integer',
  810. 'YZTCXQ_YL' => 'integer',
  811. 'YZTCXQ_SXH' => 'integer',
  812. 'YZTCXQ_YXBS' => 'integer',
  813. 'ZD_YXBS' => 'integer',
  814. 'ZD_KYXG' => 'integer',
  815. 'ZD_SXH' => 'integer',
  816. 'ZDMC_SXH' => 'integer',
  817. 'ZDMC_YZDMC' => 'integer',
  818. 'ZJLX_YXBS' => 'integer',
  819. 'ZJLX_SXH' => 'integer',
  820. 'ZS_SXH' => 'integer',
  821. 'ZS_YXBS' => 'integer',
  822. 'ZSBFZ_YXBS' => 'integer',
  823. 'ZSBFZ_SXH' => 'integer',
  824. 'ZSLB_YXBS' => 'integer',
  825. 'ZSLB_SXH' => 'integer',
  826. 'ZSSX_YXBS' => 'integer',
  827. 'ZSSX_SXH' => 'integer',
  828. 'ZSXHLX_YXBS' => 'integer',
  829. 'ZSXHLX_SXH' => 'integer',
  830. 'ZW_YXBS' => 'integer',
  831. 'ZW_SXH' => 'integer',
  832. 'ZGZD_YXBS' => 'integer',
  833. 'CDXX_PID' => 'integer',
  834. 'CDXX_LX' => 'integer',
  835. 'CDXX_PX' => 'integer',
  836. 'CDXX_ZT' => 'integer',
  837. 'JSZ_PID' => 'integer',
  838. 'JSZ_ID' => 'integer',
  839. 'JSZ_PX' => 'integer',
  840. 'ZH_CJGLY' => 'integer',
  841. 'ZHJSGL_ZHID' => 'integer',
  842. 'ZHJSGL_JSID' => 'integer',
  843. 'JQR_CLCS' => 'integer',
  844. 'ZNYG_LX' => 'integer',
  845. 'SYZZ_ZT' => 'integer',
  846. 'SYZZ_DDZT' => 'integer',
  847. ];
  848. // 特殊处理带有as别名的类型转换
  849. if($column_field !== '*'){
  850. foreach ($column_field as $key => $field){
  851. if(!is_string($field)){
  852. continue;
  853. }
  854. if(strpos(strtolower($field), 'count(') !== false){
  855. $fields[$field] = 'integer';
  856. }
  857. if(is_int($key) && strpos($field, 'as') !== false){
  858. $field_arr = explode('as', $field);
  859. $old_name = trim($field_arr[0]);
  860. $new_name = trim($field_arr[1]);
  861. } else {
  862. $old_name = $key;
  863. $new_name = $field;
  864. }
  865. if(array_key_exists($old_name, $fields)){
  866. $fields[$new_name] = 'integer';
  867. }
  868. }
  869. }
  870. // 处理类型转换
  871. foreach ($column as $key => $val){
  872. if(is_array($val)){
  873. foreach ($val as $field => $v){
  874. if(array_key_exists($field, $fields)){
  875. $column[$key][$field] = (int) $v;
  876. }
  877. }
  878. }
  879. }
  880. return $column;
  881. }
  882. /**
  883. * 数据别名大写转换
  884. * @param $list
  885. * @param $fields
  886. * @return mixed
  887. */
  888. protected function formatFieldUpper($list, $fields)
  889. {
  890. if(!$list){
  891. return $list;
  892. }
  893. if(!$fields || $fields === '*'){
  894. return $list;
  895. }
  896. // 存在别名
  897. $field_arr = [];
  898. foreach ($fields as $key => $field){
  899. if(!is_string($field)){
  900. continue;
  901. }
  902. if(is_int($key) && strpos($field, 'as') !== false){
  903. $field_arr[] = trim(explode('as', $field)[1]);
  904. } else {
  905. $field_arr[] = $field;
  906. }
  907. }
  908. if(!$field_arr){
  909. return $list;
  910. }
  911. // 别名大写转换(添加小写元素,unset大写元素)
  912. if (count($list) !== count($list, COUNT_RECURSIVE)) {
  913. // 二维数组数据
  914. foreach ($list as $key => $item) {
  915. foreach ($item as $field => $val){
  916. $lo_field = strtolower($field);
  917. if(in_array($lo_field, $field_arr)){
  918. $list[$key][$lo_field] = $val;
  919. unset($list[$key][$field]);
  920. }
  921. }
  922. }
  923. } else {
  924. // 一维数组数据
  925. foreach ($list as $field => $val){
  926. $lo_field = strtolower($field);
  927. if(in_array($lo_field, $field_arr)){
  928. $list[$lo_field] = $val;
  929. unset($list[$field]);
  930. }
  931. }
  932. }
  933. return $list;
  934. }
  935. /**
  936. * column方法单个字段和2个字段特殊处理
  937. * @param $fields
  938. * @param $result
  939. * @return array
  940. */
  941. public function formatColumnField($fields, $result)
  942. {
  943. $count = count($fields);
  944. if($count === 1){
  945. return array_keys($result);
  946. } elseif ($count === 2){
  947. foreach ($result as $field => &$val){
  948. if(strpos($fields[1], 'as') !== false){
  949. $k = strtoupper(trim(explode('as', $fields[1])[1]));
  950. $val = $val[$k];
  951. } else {
  952. $val = $val[$fields[1]];
  953. }
  954. }
  955. unset($val);
  956. return $result;
  957. }
  958. return $result;
  959. }
  960. }