CommonModel.class.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. <?php
  2. namespace Admin\Model;
  3. use Think\Model\RelationModel;
  4. /**
  5. * CommonModel
  6. * 数据库、数据表信息操作
  7. */
  8. class CommonModel extends RelationModel {
  9. /**
  10. * 更新session的键值
  11. */
  12. const UPDATE_SESSION_KEY = 'record_update';
  13. /**
  14. * 为模型创建数据表
  15. * 自动生成created_at、updated_at字段
  16. * @param string $tableName 数据表名称
  17. * @param boolean $hasPk 是否含有主键
  18. * @param string $engine 引擎类型
  19. * @return boolean 是否创建成功
  20. */
  21. public function createTable($tableName,
  22. $hasPk = true,
  23. $engine = 'InnoDB',
  24. $comment = '') {
  25. if (empty($tableName)) {
  26. return false;
  27. }
  28. $pkSql = '';
  29. if ($hasPk) {
  30. // id主键的sql
  31. $pkSql = "`id` int PRIMARY KEY NOT NULL "
  32. . "AUTO_INCREMENT COMMENT '表主键',";
  33. }
  34. $sql = "CREATE TABLE `{$tableName}` ("
  35. . $pkSql
  36. . "`created_at` int NOT NULL COMMENT '创建时间',"
  37. . "`updated_at` int NOT NULL COMMENT '更新时间'"
  38. . ") ENGINE={$engine} CHARSET=utf8 COMMENT='{$comment}'";
  39. // 创建数据表
  40. if (false === M()->query($sql)) {
  41. return false;
  42. }
  43. return true;
  44. }
  45. /**
  46. * 删除数据表
  47. * @param string $tableName 表名
  48. * @return boolean
  49. */
  50. public function dropTable($tableName) {
  51. $sql = "DROP TABLE IF EXISTS `{$tableName}`";
  52. if (false === $this->query($sql)) {
  53. return false;
  54. }
  55. return true;
  56. }
  57. /**
  58. * 得到数据表表信息
  59. * @params $tableName 数据表名称
  60. * @return array
  61. */
  62. public function getTablesInfo($tableName) {
  63. if (!isset($tableName)) {
  64. return $this->query('SHOW TABLE STATUS');
  65. }
  66. $tableInfo = $this->query("SHOW TABLE STATUS LIKE '{$tableName}'");
  67. return $tableInfo[0];
  68. }
  69. /**
  70. * 得到数据表的行数
  71. * @param string $tableName 数据表名称
  72. * @return int 行数
  73. */
  74. public function getTableRows($tableName) {
  75. if (!isset($tableName)) {
  76. return 0;
  77. }
  78. $sql = "SELECT COUNT(*) FROM {$tableName}";
  79. $result = $this->query($sql);
  80. return $result[0]['COUNT(*)'];
  81. }
  82. /**
  83. * 得到重建数据表的sql
  84. * @param string $tableName
  85. * @return string
  86. */
  87. public function getRebuildTableSql($tableName) {
  88. $sql = $this->getDropTableSql($tableName) . "\r\n";
  89. $sql .= $this->getCreateTableSql($tableName) . "\r\n";
  90. return $sql;
  91. }
  92. /**
  93. * 得到建表信息
  94. * @param string $tableName
  95. * @return string
  96. */
  97. public function getCreateTableSql($tableName) {
  98. if (!isset($tableName) || empty($tableName)) {
  99. return '';
  100. }
  101. // 设置字段名加上`
  102. $this->query('SET SQL_QUOTE_SHOW_CREATE = 1');
  103. $createTableSql = $this->query("SHOW CREATE TABLE `{$tableName}`");
  104. return $createTableSql[0]['Create Table'] . ";";
  105. }
  106. /**
  107. * 数据表是否有记录
  108. * @param string $tableName
  109. * @return boolean
  110. */
  111. public function hasRecord($tableName) {
  112. $result = $this->query("SELECT COUNT(*) FROM {$tableName}");
  113. if ($result[0]['COUNT(*)']) {
  114. return true;
  115. }
  116. return false;
  117. }
  118. /**
  119. * 修改表名
  120. * @param string $tableName 需要修改的表名
  121. * @param string $newTableName 新表名
  122. * @return boolean
  123. */
  124. public function updateTableName($tableName, $newTableName) {
  125. $sql = "ALTER TABLE `{$tableName}` RENAME TO `{$newTableName}`";
  126. return $this->query($sql);
  127. }
  128. /**
  129. * 修改表注释
  130. * @param string $tableName 需要修改的表名
  131. * @param string $comment 注释
  132. * @return boolean
  133. */
  134. public function updateTableComment($tableName, $comment) {
  135. $sql = "ALTER TABLE `{$tableName}` COMMENT '{$comment}'";
  136. return $this->query($sql);
  137. }
  138. /**
  139. * 优化数据表
  140. * @param string $tableName 数据表名称
  141. * @return boolean 是否优化成功
  142. */
  143. public function optimizeTables($tableName) {
  144. if (!isset($tableName)) {
  145. return false;
  146. }
  147. $this->query("OPTIMIZE TABLE {$tableName}");
  148. return true;
  149. }
  150. /**
  151. * 修复数据表
  152. * @param string $tableName 数据表名称
  153. * @return boolean 是否修复成功
  154. */
  155. public function repairTables($tableName) {
  156. if (!isset($tableName)) {
  157. return false;
  158. }
  159. $this->query("REPAIR TABLE {$tableName}");
  160. return true;
  161. }
  162. /**
  163. * 得到删除数据库的sql
  164. * @param string $tableName
  165. * @return string
  166. */
  167. private function getDropTableSql($tableName) {
  168. return "DROP TABLE IF EXISTS `{$tableName}`;";
  169. }
  170. /**
  171. * 添加字段到数据表
  172. * @param string $tn 数据表名称
  173. * @param string $cn 字段名称
  174. * @param string $type 字段类型
  175. * @param int $length 字段长度
  176. * @param mixed $value 字段默认值
  177. * @param string $comment 字段注释
  178. * @return mixed
  179. */
  180. public function addColumn($tn, $cn, $type, $length, $value, $comment) {
  181. // 添加字段的sql
  182. $sql = "ALTER TABLE `{$tn}` ADD COLUMN `{$cn}` {$type}";
  183. // 类型长度
  184. if (isset($length) && 0 != $length) {
  185. $sql .= "({$length}) ";
  186. }
  187. // 默认值
  188. if (isset($value) && '' != $value) {
  189. $text = array('CHAR', 'VARCHAR', 'TEXT',
  190. 'TINYTEXT', 'MEDIUMTEXT', 'LONGTEXT');
  191. if (in_array($type, $text)) {
  192. // 字符默认值
  193. $sql .= " NOT NULL DEFAULT '{$value}' ";
  194. } else {
  195. // 数值型
  196. $sql .= " NOT NULL DEFAULT {$value} ";
  197. }
  198. }
  199. // 字段注释
  200. if (isset($comment) && '' != $comment) {
  201. $sql .= " COMMENT '{$comment}' ";
  202. }
  203. return $this->query($sql);
  204. }
  205. /**
  206. * 修改列基本属性
  207. * @param string $tn 数据表名
  208. * @param string $cn 需要修改的列名
  209. * @param string $ncn 新列名
  210. * @param string $type 列的类型
  211. * @param int $len 字段长度
  212. * @param string $cm 字段注释
  213. * @return mixed
  214. */
  215. public function alterColumnAttr($tn, $cn, $ncn, $type, $len, $cm) {
  216. $sql = "ALTER TABLE {$tn} CHANGE COLUMN {$cn} {$ncn} {$type} ";
  217. if (isset($len) && 0 !== $len) {
  218. $sql .= "({$len}) ";
  219. }
  220. if (isset($cm)) {
  221. $sql .= "COMMENT '{$cm}'";
  222. }
  223. return $this->query($sql);
  224. }
  225. /**
  226. * 删除列默认值
  227. * @param string $tn 数据表名
  228. * @param string $cn 需要修改的列名
  229. * @return mixed
  230. */
  231. public function dropColumnDefault($tn, $cn) {
  232. $sql = "ALTER TABLE {$tn} ALTER COLUMN {$cn} DROP DEFAULT";
  233. return $this->query($sql);
  234. }
  235. /**
  236. * 设置列默认值
  237. * @param string $tn 数据表名
  238. * @param string $cn 需要修改的列名
  239. * @param string $value 字段默认值
  240. * @return mixed
  241. */
  242. public function setColumnDefault($tn, $cn, $value) {
  243. $sql = "ALTER TABLE {$tn} ALTER COLUMN {$cn} set DEFAULT '{$value}'";
  244. return $this->query($sql);
  245. }
  246. /**
  247. * 修改列默认值
  248. * @param string $tn 数据表名
  249. * @param string $cn 需要修改的列名
  250. * @param string $value 字段默认值
  251. * @return mixed
  252. */
  253. public function alterColumnValue($tn, $cn, $value) {
  254. $this->dropColumnDefault($tn, $cn);
  255. return $this->setColumnDefault($tn, $cn, $value);
  256. }
  257. /**
  258. * 从数据表中删除字段
  259. * @param string $tn 数据表名称
  260. * @param string $cn 字段名称
  261. * @return mixed
  262. */
  263. public function dropColumn($tn, $cn) {
  264. $sql = "ALTER TABLE `{$tn}` DROP `{$cn}`";
  265. return $this->query($sql);
  266. }
  267. /**
  268. * 添加索引
  269. * @param string $tn 数据表名称
  270. * @param string $cn 字段名称
  271. * @param string $idxn 索引名称
  272. * @return mixed
  273. */
  274. public function addIndex($tn, $cn, $idxn) {
  275. $sql = "CREATE INDEX {$idxn} ON `{$tn}`(`{$cn}`)";
  276. return $this->query($sql);
  277. }
  278. /**
  279. * 添加唯一索引
  280. * @param string $tn 数据表名称
  281. * @param string $cn 字段名称
  282. * @param string $idxn 索引名称
  283. * @return mixed
  284. */
  285. public function addUnique($tn, $cn, $idxn) {
  286. $sql = "CREATE UNIQUE INDEX {$idxn} ON `{$tn}`(`{$cn}`)";
  287. return $this->query($sql);
  288. }
  289. /**
  290. * 删除索引
  291. * @param string $tn 数据表名称
  292. * @param string $idxn 索引名称
  293. * @return mixed
  294. */
  295. public function dropIndex($tn, $idxn) {
  296. $sql = "DROP INDEX {$idxn} ON `{$tn}`";
  297. return $this->query($sql);
  298. }
  299. /**
  300. * 验证条件
  301. * @param array $conditions 验证条件
  302. * @param array $marray 模型数组
  303. * @param int $id 需要更新字段的id
  304. * @return boolean 是否可用
  305. */
  306. protected function validateConditions(array $conditions, $marray, $id) {
  307. $this->preUpdate($marray, $id);
  308. $result = $this->validate($conditions)->create($marray);
  309. $this->afterUpdate($marray, $id);
  310. return $result;
  311. }
  312. /**
  313. * 验证字段值是否唯一
  314. * @param string $fieldName 需要检查的字段名
  315. * @param string $value 字段值
  316. * @return boolean 是否唯一
  317. */
  318. public function isUnique($fieldName, $value) {
  319. $where = array($fieldName => $value);
  320. $updateId = $this->getUpdateSession('update_id');
  321. if (isset($updateId)) {
  322. $where['id'] = array('neq', $updateId);
  323. }
  324. if (0 == $this->where($where)->count()) {
  325. return true;
  326. }
  327. return false;
  328. }
  329. /**
  330. * 设置更新外键或者id
  331. * @param String $key
  332. * @param mixed $value
  333. * @return
  334. */
  335. protected function setUpdateSession($key, $value) {
  336. if (isset($key) && !is_null($key) && !is_null($value)) {
  337. $_SESSION[self::UPDATE_SESSION_KEY][$key] = $value;
  338. }
  339. }
  340. /**
  341. * 得到更新外键或者id的值
  342. * @param String $key
  343. * @return
  344. */
  345. protected function getUpdateSession($key) {
  346. return $_SESSION[self::UPDATE_SESSION_KEY][$key];
  347. }
  348. /**
  349. * 销毁更新外键或者id
  350. * @param String $key
  351. * @return
  352. */
  353. protected function unsetUpdateSession($key) {
  354. unset($_SESSION[self::UPDATE_SESSION_KEY][$key]);
  355. }
  356. /**
  357. * 更新前的操作
  358. *
  359. * @return
  360. */
  361. protected function preUpdate($marray, $id) {
  362. // to do something...
  363. }
  364. /**
  365. * 更新完成后的操作
  366. * @return
  367. */
  368. protected function afterUpdate($marray, $id) {
  369. // to do something...
  370. }
  371. }