| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 | <?phpdeclare(strict_types=1);namespace app\common\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();    }}
 |