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!", 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(); } }