123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- <?php
- declare(strict_types=1);
- namespace app\utils;
- // 引入框架内置类
- use think\facade\Db;
- use think\facade\Config;
- /**
- * 模型 utils
- *
- * @version 0.0.1
- * @author by huwhois
- * @time 2022/08/10
- */
- class ModelUtils
- {
- protected $namespace;
- protected $class;
- protected $tableName;
- protected $databaseName;
- protected function getPathName(string $name): string
- {
- $name = substr($name, 4);
- return app()->getBasePath() . ltrim(str_replace('\\', '/', $name), '/') . '.php';
- }
- protected function getStub(): string
- {
- return __DIR__ . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'model.stub';
- }
- /**
- * 获取表的主键
- * @return string
- */
- protected function getPrimarykey()
- {
- $sql = "SELECT COLUMN_NAME AS pk FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_NAME = '" . $this->tableName . "' AND table_schema = '.$this->databaseName.' AND CONSTRAINT_NAME = 'PRIMARY'";
- $res = Db::query($sql);
- $pk = empty($res) ? '' : $res[0]['pk'];
- return $pk;
- }
- /**
- * 获取表的所有字段信息
- * @return array
- */
- protected function getColumns(string $tableName = '', string $database = '')
- {
- $sql = "SELECT column_name,column_comment,data_type FROM information_schema.COLUMNS WHERE TABLE_NAME = '" . $this->tableName . "' AND table_schema = '" . $this->databaseName . "'";
- // echo $sql . "\n";
- $res = Db::query($sql);
- $columns = empty($res) ? [] : $res;
- return $columns;
- }
- /**
- * 构建Class文件
- * @return string
- */
- protected function buildClass()
- {
- $stub = file_get_contents($this->getStub());
- $primarykey = "";
- $pk = $this->getPrimarykey();
- if ($pk != "" && $pk != "id") {
- $primarykey = 'protected $pk = "' . $pk . '";';
- }
- $schemas = '';
- $autoWriteTimestamp = '';
- $create_time = false;
- $update_time = false;
- $columns = $this->getColumns();
- foreach ($columns as $column) {
- $schemas .= "\n" . ' "' . $column['column_name'] . '" => "' . $column['data_type'] . '", // ' . $column['column_comment'];
- if ($column['column_name'] == 'create_time') {
- $create_time = true;
- }
- if ($column['column_name'] == 'update_time') {
- $update_time = true;
- }
- }
- if (!$create_time || !$update_time) {
- $autoWriteTimestamp = 'protected $autoWriteTimestamp = false;';
- }
- return str_replace(['{%namespace%}', '{%className%}', '{%primarykey%}', '{%schemas%}', '{%autoWriteTimestamp%}'], [
- $this->namespace,
- $this->class,
- $primarykey,
- $schemas,
- $autoWriteTimestamp
- ], $stub);
- }
- /**
- * 生成 Model 文件
- * @param string $name 类目,包含命名空间
- * @param string $connections 数据库配置, 默认 mysql
- */
- public function makeModel(string $name, string $connections = 'mysql')
- {
- $pathname = $this->getPathName($name);
- if (is_file($pathname)) {
- throw new \Exception("Model :' . $name . ' already exists!</error>", 1);
- }
- if (!is_dir(dirname($pathname))) {
- mkdir(dirname($pathname), 0755, true);
- }
- file_put_contents($pathname, $this->codeModel($name, $connections));
- }
- /**
- * 生成 Model 不生成文件
- * @param string $name 类目,包含命名空间
- * @param string $connections 数据库配置, 默认 mysql
- * @return string
- */
- public function codeModel(string $name, string $connections = 'mysql')
- {
- $this->namespace = trim(implode('\\', array_slice(explode('\\', $name), 0, -1)), '\\');
- $this->class = str_replace($this->namespace . '\\', '', $name);
- $this->tableName = Config::get('database.connections.'.$connections.'.prefix') . strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', $this->class));
- $this->databaseName = Config::get('database.connections.'.$connections.'.database');
- return $this->buildClass();
- }
- }
|