Swoft 框架精华教程:Devtool 详解

[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_schematable_name 可以筛选到对应的表的结构信息。

列数据的存储(column schema)

所有列相关信息都存储在:information_schema.columns 中。通过对字段 table_schematable_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