ThinkPHP 类似Yii的Gii生成Model的功能。

ThinkPHP 类似Yii的Gii生成Model的功能。自动生成ThinkPhp 3.1 的基础模型.。

  1 #!/usr/bin/env php
  2 <?php
  3 /**
  4  *
  5  * THINKPHP 基础模型生成工具
  6  * 使用方法
  7  *  命令行: php 本php文件 表名字
  8  *   然后复制生成好的代码
  9  *
 10  *
 11  */
 12
 13
 14 $host = ‘localhost‘;
 15 $user = ‘root‘;
 16 $pass = ‘root‘;
 17
 18 $tablePre = ‘weixin_‘;//表前缀
 19 $dbName = ‘weixin2‘;
 20
 21
 22 if($argc < 2)
 23 {
 24     $s = __FILE__;
 25     $str = " 使用方法:php $s tableName";
 26     $num = strlen($str);
 27     print_r(str_repeat(‘-‘,$num)."\r\n ThinkPHP 基础模型生成工具\r\n 使用方法:php $s tableName\r\n".str_repeat(‘-‘,$num)."\r\n");
 28     return;
 29 }
 30
 31
 32
 33
 34 $mysql = new mysqli($host, $user, $pass, $dbName);
 35 $Tii = new ThinkTii($mysql, $tablePre, $argv[1]);
 36
 37
 38 $search = array(
 39     ‘{%fields%}‘,
 40     ‘{%tableName%}‘,
 41     ‘{%trueTableName%}‘,
 42     ‘{%dbName%}‘,
 43     ‘{%className%}‘,
 44     ‘{%_auto%}‘,
 45     ‘{%_validate%}‘,
 46     ‘{%property%}‘);
 47 $replace = array(
 48     $Tii->getFieldString(),
 49     $Tii->getTableName(),
 50     $Tii->getTrueTableName(),
 51     $Tii->getDbName(),
 52     $Tii->getModelClassName(),
 53     $Tii->getAutoFill(),
 54     $Tii->getAutoValidate(),
 55     $Tii->getProperty());
 56
 57 $classString = str_replace($search, $replace, $Tii->getTiiTpl());
 58
 59 echo $classString;
 60
 61
 62 function arrayToString($array)
 63 {
 64     $string = "array( ";
 65
 66     ksort($array, SORT_NATURAL);
 67     list($key) = each($array);
 68     $key === 0 and $i = 0;
 69     reset($array);
 70
 71     foreach ($array as $key => $value) {
 72         if (isset($i) && $key == $i && ++$i) {
 73             $key = ‘‘;
 74         } else {
 75             $key = var_export($key, true) . " => ";
 76             unset($i);
 77         }
 78         if (is_array($value)) {
 79             $string .= $key . arrayToString($value) . ‘, ‘;
 80         } else {
 81             $string .= $key . var_export($value, true) . ‘, ‘;
 82         }
 83     }
 84     $string = trim(trim($string, ‘ ‘), ‘,‘);
 85     $string .= ")";
 86
 87     return $string;
 88 }
 89
 90
 91 /**
 92  * Class ThinkTii
 93  *
 94  * 自动生成ThinkPhp 3.1 的模型
 95  *
 96  */
 97 class ThinkTii
 98 {
 99
100     const TYPE_INT = ‘integer‘;
101     const TYPE_STRING = ‘string ‘;
102
103
104     /**
105      * @var mysqli
106      */
107
108     protected $mysql = null;
109     protected $tablePre = ‘‘;
110     protected $dbName = ‘‘;
111     protected $isHump = true;
112     protected $host = ‘localhost‘;
113     protected $user = ‘root‘;
114     protected $pass = ‘root‘;
115     protected $tableName = ‘‘;
116     protected $trueTableName = ‘‘;
117
118
119     public function __construct($mysql, $tablePre, $tableName)
120     {
121         $this->tableName = $tableName;
122         $this->tablePre = $tablePre;
123         $this->trueTableName = $this->tablePre . $tableName;//要生成哪张表,完整表名
124         $this->mysql = $mysql;
125     }
126
127     public function getDbName()
128     {
129         $row = $this->mysql->query("select database();")->fetch_row();
130         $this->dbName = $row[0];
131         return $this->dbName;
132     }
133
134     public function getTableName()
135     {
136         return $this->tableName;
137     }
138
139
140     /**
141      * 小驼峰转大驼峰
142      * @param $name
143      * @return mixed|string
144      */
145     public function humpSmallToBig($name)
146     {
147         $str = str_replace(‘_‘, ‘ ‘, $name);
148         $str = ucwords($str);
149         $str = str_replace(‘ ‘, ‘‘, $str);
150         return $str;
151     }
152
153
154     public function getDesc($tableName)
155     {
156         $sql = "desc " . $this->getTrueTableName($tableName);
157         $this->mysql->set_charset(‘utf-8‘);
158         $query = $this->mysql->query($sql);
159         $fetch = array();
160         while (is_array($row = $query->fetch_array(MYSQL_ASSOC))) {
161             $fetch[] = $row;
162         }
163         return $fetch;
164     }
165
166
167     public function getTiiFields($tableName)
168     {
169         $fetch = $this->getDesc($tableName);
170
171         $fields = array();
172         foreach ($fetch as $value) {
173             $fields[] = $value[‘Field‘];
174             if (strpos($value[‘Key‘], ‘PRI‘) !== false) {
175                 $fields[‘_pk‘] = $value[‘Field‘];
176             }
177             if ($value[‘Extra‘] == ‘auto_increment‘) {
178                 $fields[‘_autoinc‘] = true;
179             }
180         }
181         return $fields;
182     }
183
184
185     public function getAutoFill()
186     {
187         $fetch = $this->getDesc($this->getTrueTableName());
188         $array = array();
189         foreach ($fetch as $field) {
190             if ($field[‘Default‘] !== null) {
191                 $array[] = array($field[‘Field‘], $field[‘Default‘]);
192             }
193         }
194         return arrayToString($array);
195     }
196
197
198     public function getAutoValidate()
199     {
200         $fetch = $this->getDesc($this->getTrueTableName());
201         $requires = $urls = $emails = $numbers = $array = $numbers = $number1s = array();
202         foreach ($fetch as $field) {
203             $NotNull = false;
204             if ($field[‘Null‘] == "NO" && $field[‘Default‘] === null) {
205                 $NotNull = true;
206                 //$array[] = array($field[‘Field‘], ‘require‘, $field[‘Field‘] . ‘ Can not be a null!‘, 1);
207                 $requires[] = $field[‘Field‘];
208             }
209             if ($field[‘Key‘] == "UNI") {
210                 $array[] = array($field[‘Field‘], ‘‘, ‘值已经存在!‘, 1, ‘unique‘);
211             }
212
213             switch ($this->getType($field[‘Type‘])) {
214                 case self::TYPE_INT:
215                     if ($NotNull) {
216                         $number1s[] = $field[‘Field‘];
217                     } else {
218                         $numbers[] = $field[‘Field‘];
219                     }
220                     break;
221                 case self::TYPE_STRING:
222                     if (strpos($field[‘Field‘], ‘mail‘)) {
223                         $emails[] = $field[‘Field‘];
224                     } elseif (strpos($field[‘Field‘], ‘url‘)) {
225                         $urls[] = $field[‘Field‘];
226                     }
227                     break;
228                 case ‘enum‘:
229                     $string = rtrim(str_replace(array(‘enum(‘), ‘‘, $field[‘Type‘]), ‘)‘);
230                     $string = explode(‘,‘, $string);
231                     $_tmp = array();
232                     foreach ($string as $str) {
233                         $_tmp[] = trim($str, "‘");
234                     }
235                     $array[] = array($field[‘Field‘], $_tmp, ‘值的范围不正确!‘, 2, ‘in‘);
236                     unset($_tmp);
237                     break;
238             }
239         }
240         empty($numbers) or $array[] = array(implode(‘,‘, $numbers), ‘number‘, ‘ 格式不对‘);
241         empty($number1s) or $array[] = array(implode(‘,‘, $number1s), ‘number‘, ‘ 格式不对‘, 1);
242         empty($emails) or $array[] = array(implode(‘,‘, $emails), ‘email‘, ‘ 格式不对‘);
243         empty($urls) or $array[] = array(implode(‘,‘, $urls), ‘url‘, ‘ 格式不对‘);
244         empty($requires) or $array[] = array(implode(‘,‘, $requires), ‘require‘, ‘ Can not be a null!‘, 1);
245
246         return arrayToString($array);
247     }
248
249
250     public function getProperty()
251     {
252         $fetch = $this->getDesc($this->getTrueTableName());
253         $property = array();
254         foreach ($fetch as $field) {
255             $type = $this->getType($field[‘Type‘]);
256             $type = $type == ‘enum‘ ? self::TYPE_STRING : $type;
257             $property[] = " * @property $type \${$field[‘Field‘]}";
258         }
259         return implode("\r\n", $property);
260     }
261
262
263     protected function getType($typeString)
264     {
265         list($type) = explode(‘(‘, $typeString);
266         $types = array(
267             self::TYPE_INT => array(‘int‘),
268             self::TYPE_STRING => array(‘text‘, ‘char‘, ‘varchar‘)
269         );
270
271         foreach ($types as $key => $value) {
272             if (in_array($type, $value)) {
273                 return $key;
274             }
275         }
276         return $type;
277     }
278
279
280     public function getFieldString()
281     {
282         $fieldString = arrayToString($this->getTiiFields($this->tableName));
283         return $fieldString;
284     }
285
286
287     public function getTrueTableName()
288     {
289         return $this->trueTableName;
290     }
291
292     public function getModelClassName()
293     {
294         if ($this->isHump) {
295             $className = $this->humpSmallToBig($this->tableName);
296         } else {
297             $className = $this->tableName;
298         }
299         return $className;
300     }
301
302
303     public function getTiiTpl()
304     {
305         $time = date(‘Y-m-d H:s:i‘);
306         $t = <<<__END
307 <?php
308
309 /**
310  *
311  * Class {%className%}Model
312  *  Tii自动生成。请更具自己实际项目需求进行更改
313  *      自动验证\$_validate 和自动完成 \$_auto 是更具数据库表默认设置进行生成的。
314  *
315  * 按照字段自动生成的类属性。方便IDE代码自动补全
316  *
317 {%property%}
318  *
319  * @lastTime $time
320  * @author niy <[email protected]>
321  *
322  */
323 class {%className%}Model extends Model{
324     /**
325      * @var string 表名
326      */
327     protected \$tableName = ‘{%tableName%}‘;
328     /**
329      * @var string 真实的表名
330      */
331     protected \$trueTableName = ‘{%trueTableName%}‘;
332     /**
333      * @var string 该模型属于哪个数据库
334      */
335     protected \$dbName = ‘{%dbName%}‘;
336     /**
337      * @var array 本章表的字段
338      */
339     protected \$fields = {%fields%};
340
341     /**
342      * 自动完成
343      * @url http://doc.thinkphp.cn/manual/auto_operate.html
344      * @var array
345      */
346     protected \$_auto = {%_auto%};
347
348     /**
349      * 自动验证
350      * @url http://doc.thinkphp.cn/manual/auto_validate.html
351      * @var array
352      */
353     protected \$_validate = {%_validate%};
354
355
356     /**
357      * 以免破坏程序罗辑,以下函数不需要的请删除。
358      */
359     protected function _before_insert(&\$data, \$options){}
360     protected function _after_insert(\$data,\$options) {}
361     protected function _before_update(&\$data,\$options) {}
362     protected function _after_update(\$data,\$options) {}
363     protected function _after_select(&\$resultSet,\$options) {}
364     protected function _after_delete(\$data,\$options) {}
365     protected function _after_find(&\$result,\$options) {}
366 }
367
368 __END;
369         return $t;
370     }
371
372
373 }

时间: 2024-11-06 22:52:18

ThinkPHP 类似Yii的Gii生成Model的功能。的相关文章

YII 用gii生成modules模块下的mvc

1.生成model ModelPath设置为: application.modules.[moduleName].models 2.生成CURD ModelClass设置为: application.modules.[moduleName].models.[modelName] Controller ID设置为: moduleName/ControllerID

Yii2 自定义Gii生成代码模板

我们使用一个例子来介绍如何定制代码模板.假设我们想要定制由 model 生成器生成的代码. 我们首先创建一个名为 protected/gii/model/templates/customer 的目录.这里的model意味着我们将要 override 默认的 model 生成器.templates/customer意味着我们将增加一个新的代码模板集名为customer.复制文件 framework/gii/generators/model/templates/default/model.php 到

yii2使用Gii生成代码

本章节将介绍如何使用 Gii 去自动生成 Web 站点常用功能的代码.使用 Gii 生成代码非常简单,只要按照 Gii 页面上的介绍输入正确的信息即可. 贯穿本章节,你将会学到: 在你的应用中开启 Gii 使用 Gii 去生成活动记录类 使用 Gii 去生成数据表操作的增查改删(CRUD)代码 自定义 Gii 生成的代码 开始 Gii Gii 是 Yii 中的一个模块.可以通过配置应用的 [[yii\base\Application::modules|modules]] 属性开启它.通常来讲在 

yii之gii

一:gii 使用 Gii 生成代码非常简单. 二:打开Gii http://www.yiichina.com/doc/guide/2.0/start-gii 如果你通过本机以外的机器访问 Gii,请求会被出于安全原因拒绝.你可以配置 Gii 为其添加允许访问的 IP 地址:添加代码为 出现访问 Gii是出现403 拒绝错误时,我们需要为其添加允许访问的IP地址. 为其添加允许访问的 IP 地址方法是 /config/web.php if (YII_ENV_DEV) {     // config

Yii2自动生成model

yii里一个表对应一个model,是自己生成,前台使用的model在fronted/web目录下的gii生成例如(www.gyr.com/yii/frontend/web/index.php?r=gii),后台是在backend/web下,例如(http://www.gyr.com/yii/backend/web/index.php?r=gii) ; 然后输入完后 最下方  点击preview,然后  再点击 generate按钮 ok 完成,这时候找你的框架目录,model下面会多一个 Fie

使用MybatisGenerator自动生成Model,Mapping和Mapper文件

Mybatis和Hibernate都是持久层框架,MyBatis出现的比Hibernate晚,这两种框架我都用过,对于二者的优势我的感触不深,个人感觉MyBatis自动生成model,Mapping,mapper文件的功能使编码量减少,但也很容易出错,出错后还不易排查. 我在网上搜索了一下关于Mybatis和Hibernate的比较,知乎上的这个帖子讲得比较详细,大家可以参考一下 https://www.zhihu.com/question/21104468 想要自动生成文件,首先要下载MyBa

基于OCILIB的oracle数据库操作总结及自动生成Model和Dao的工具

基于OCILIB的oracle数据库操作总结 1.       类图 2.       基类BaseOCIDao的设计与实现 BaseOCIDao.h头文件 #pragma once /* --------------------------------------------------------------------------------------------- * * INCLUDES * ----------------------------------------------

Mybatis中使用mybatis-generator结合Ant脚本快速自动生成Model、Mapper等文件

使用过Mybatis的同学都知道,针对每一个项目中使用到的数据库表都需要建立其对应的数据库增删改查xxxMapper.xml文件.实体类xxx.java文件以及其他类用来调用进行数据库操作的xxxMapper.java文件.在开始学习Mybatis时,我相信不少人都是通过手动来建立这些文件的.毫无疑问,如果项目比较大的话还通过手动建立这些文件效率是非常低的,这时我们可以通过mybatis-generator来自动生成这些文件.但是,这个工具默认是以命令行的形式来生成相关文件的,因此我们可以通过写

Django 反向生成 从数据库生成Model

Django 反向生成 从数据库生成Model 使用Django生成Model python manage.py inspectdb或python manage.py inspectdb > models.py 就可以生成了自动产生Django model