当前位置: 首页 > 后端技术 > PHP

YII2命令行实现数据库表结构文档自动生成

时间:2023-03-29 18:01:01 PHP

因为要写数据库表描述的文档,所以需要表结构。如果一张一张建表,然后把每个字段都复制进去,效率就太低了。其实程序很简单,就是用程序获取数据库schema,然后写入markdown文件(文件格式md)。因为项目是基于YII2框架,所以是用YII2的命令工具实现的。大概效果图如下:*@since2018-01-18*/classTableSchemaControllerextendsController{/***数据库表生成*/publicfunctionactionCreate(){global$argv;if(!$argv[2]||strcasecmp($argv[2],'help')===0){echo"Usage:./yiitable-schema/create[all|tablename][filename]\n";出口;$db=Yii::$app->db;$allTables=$db->getSchema()->getTableNames();if('all'===$argv[2]){$tables=array_diff($allTables,$this->filterTables());}else{if(!in_array($argv[2],$allTables)){echosprintf("%s不存在\n",$argv[2]);出口;}$表=(数组)$argv[2];}//当前数据库中没有表if(count(array_filter($tables))==0){echo"数据库没有表\n";}$root=目录名(目录名(目录名(__FILE__)));$文件名=$argv[3]?$argv[3]:'/docs/note/数据库设计和字典描述.md';$文件路径=$根目录。$文件名;$fp=fopen($filePath,'a+');if(!$fp){echo"打开文件失败\n";}foreach($tablesas$table){$schema=$db->getTableSchema($table,true);如果(!$schema->columns){继续;}fwrite($fp,"####$schema->nametable\n");//标题$header="|字段名|类型|描述|\n";$header.="|:--------:|:--------:|:--------:|\n";fwrite($fp,$header);//字段$row='';foreach($schema->columnsas$col=>$obj){$comment=$obj->isPrimaryKey?'主键':$obj->评论;$row.="|$obj->名称|$obj->数据库类型|$评论|\n";}fwrite($fp,$row);fwrite($fp,"\r\n\r\n");echo"$schema->namesuccessfully\n";}fclose($fp);}/***需要过滤的表(不想生成文档的表)*@returnarray*/protectedfunctionfilterTables(){$filterTables=['tbmigration','tbAuthAssignment','tbAuthItemChild','tbAuthRule','tbItemTable'];return$filterTables;}/***所有表*@return\string[]*/protectedfunctionallTables(){returnYii::$app->db->getSchema()->getTableNames();}/***Clear*/publicfunctionactionClear(){global$argv;if(!$argv[2]||strcasecmp($argv[2],'help')===0){echo"Usage:./yiitable-schema/clear[filename]\n";exit;}$root=dirname(dirname(dirname(__FILE__)));$文件路径=$argv[2]?$argv[2]:'/docs/note/数据库设计与字典描述.md';$文件路径=$根目录。$文件路径;if(!is_file($filePath)){echo"$filePath不存在\n";出口;}$fp=fopen($filePath,'w');if(!$fp){echo"打开文件失败\n";}fwrite($fp,'');fclose($fp);echo"清除成功\n";}}执行命令:./yiitable-schema/create[all|tablename][filename]#例如生成所有表到test.md文件中。/yiitable-schema/createalltest.md#generateusertabletotest.mdfile./yiitable-schema/createusertest.md#clearthefile./yiitable-schema/clear[filename]程序很简单,但是很实用~~