Swoft 框架精华教程:Devtool 详解
- 作者: 刘杰
- 来源: 技术那些事
- 阅读:104
- 发布: 2025-06-16 09:35
- 最后更新: 2025-08-23 06:54
[toc]
模板生成
通过获取数据库的 schema,来识别数据库的表结构,以及所有字段的类型,据此,来生成对应的数据表的实体 Entity 类。
如果想自定义 Entity 的生成模板,就需要了解 devtool 工具的模板生成机制。
schema 组件
此组件是通过 bean 获取的方式,拿到的类的实例,默认此组件的生成是通过 db
扩展中的src/Schema/MySqlBuilder.php
类来生成的。所有 schema 的操作都封装在此。此外,对 schema 其他相关的操作(比如 Migration 创建等)一般也是基于此组件。
所有 schema 的结构信息,都存储在 information_schema
库中。mysql 中这个库是必须的,存储所有用户自定义的数据库的结构信息。
表结构的存储(table schema)
所有表相关的信息都存储在:information_schema.tables
中。通过对字段 table_schema
,table_name
可以筛选到对应的表的结构信息。
列数据的存储(column schema)
所有列相关信息都存储在:information_schema.columns
中。通过对字段 table_schema
,table_name
筛选可以获取到对应数据库的表中的列的相关信息。
information_schema.columns
表主要信息说明:
列名 | 说明 | 用户设计表中示例 |
---|---|---|
COLUMN_NAME | 字段名称 | 自定义字段名:id/name/password |
DATA_TYPE | 字段数据类型 | varchar/tinyint/bigint |
COLUMN_DEFAULT | 字段定义的默认值 | 字符串可以设置为空格,整形可以设为0等 |
COLUMN_KEY | PRI/UNI/MUL | |
IS_NULLABLE | 是否允许为null | YES/NO |
COLUMN_TYPE | 字段详细类型 | varchar(100)、bigint unsigned、tinyint |
COLUMN_COMMENT | 备注信息 | 列的备注信息 |
CHARACTER_MAXIMUM_LENGTH | 字符类型数据的最大长度 | 比如 varchar(100),则最大长度为100 只针对字符类型数据 |
EXTRA | 额外信息 |
数据库类型和PHP中类型的映射关系如下:(src/Schema/Grammars/MySqlGrammar.php
)
php
// PHP 中基本类型的定义
public const INT = 'int'; // php integer type
public const STRING = 'string'; // php string type
public const FLOAT = 'float'; // php float type
public const BOOLEAN = 'boolean'; // php boolean type
public const BOOL = 'bool'; // php boolean type
public const ARRAY = 'array'; // php array type
/**
* 数据库中数据类型与PHP类型的映射表
* @var array
*/
public $phpMap = [
'tinyint' => self::INT,
'bit' => self::INT,
'smallint' => self::INT,
'mediumint' => self::INT,
'int' => self::INT,
'integer' => self::INT,
'bigint' => self::INT,
'float' => self::FLOAT,
'double' => self::FLOAT,
'real' => self::FLOAT,
'decimal' => self::FLOAT,
'numeric' => self::FLOAT,
'tinytext' => self::STRING,
'mediumtext' => self::STRING,
'longtext' => self::STRING,
'longblob' => self::STRING,
'blob' => self::STRING,
'text' => self::STRING,
'varchar' => self::STRING,
'string' => self::STRING,
'char' => self::STRING,
'datetime' => self::STRING,
'year' => self::STRING,
'date' => self::STRING,
'time' => self::STRING,
'timestamp' => self::STRING,
'enum' => self::STRING,
'varbinary' => self::STRING,
'json' => self::ARRAY,
];
// 数据库中获取类型的映射,通过 type 获取的数据库中数据的类型。
$columns = [
'COLUMN_NAME as name',
'DATA_TYPE as type',
'COLUMN_DEFAULT as default',
'COLUMN_KEY as key',
'IS_NULLABLE as nullable',
'COLUMN_TYPE as columnType',
'COLUMN_COMMENT as columnComment',
'CHARACTER_MAXIMUM_LENGTH as length',
'EXTRA as extra'
];
列存储的表:
sql
SELECT COLUMN_NAME,DATA_TYPE,COLUMN_DEFAULT,COLUMN_KEY, IS_NULLABLE, COLUMN_TYPE, COLUMN_COMMENT, CHARACTER_MAXIMUM_LENGTH, EXTRA FROM `COLUMNS` where TABLE_SCHEMA='test' and TABLE_NAME='category'
指定模板
shell
# 指定自定义模板的路径为 @resource/template
php bin/swoft entity:c category --td=@resource/template