src/decorator/entity/Entity.ts
import {getMetadataArgsStorage} from "../../index";
import {TableMetadataArgs} from "../../metadata-args/TableMetadataArgs";
import {EntityOptions} from "../options/EntityOptions";
//实体装饰器工厂方法声明
export function Entity(options?: EntityOptions): Function;
//第一个参数为实体表名
export function Entity(name?: string, options?: EntityOptions): Function;
//工厂方法方法实现
export function Entity(nameOrOptions?: string|EntityOptions, maybeOptions?: EntityOptions): Function {
//获取选项
const options = (typeof nameOrOptions === "object" ? nameOrOptions as EntityOptions : maybeOptions) || {};
//表名
const name = typeof nameOrOptions === "string" ? nameOrOptions : options.name;
//返回装饰器
return function (target: Function) {
//表元数据参数
const args: TableMetadataArgs = {
//实体类构造函数
target: target,
//表名
name: name,
//类型
type: "regular",
//查询结果默认排序
orderBy: options && options.orderBy ? options.orderBy : undefined,
//引擎
engine: options && options.engine ? options.engine : undefined,
//所属数据库,可以覆盖连接选项中的数据库
database: options && options.database ? options.database : undefined,
//schema,个别数据库支持
schema: options && options.schema ? options.schema : undefined,
//是否跳过同步,即连接如果设置为 synchronize: true时,是否跳过同步这个表
skipSync: !!(options && options.skipSync === true)
};
//添加元数据参数
getMetadataArgsStorage().tables.push(args);
};
}
测试1:
import {Column, Entity} from "../../../src/index";
import {PrimaryColumn} from "../../../src/decorator/columns/PrimaryColumn";
import {Generated} from "../../../src/decorator/Generated";
@Entity()
export class Post {
@PrimaryColumn("integer")
id: number;
}
表结构:
+-------+------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+------------------------------------------------------------------------------------------------------------+
| post | CREATE TABLE `post` (
`id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+------------------------------------------------------------------------------------------------------------+
默认情况下,表名为实体名小写
测试2:
import {Column, Entity} from "../../../src/index";
import {PrimaryColumn} from "../../../src/decorator/columns/PrimaryColumn";
import {Generated} from "../../../src/decorator/Generated";
@Entity('post_test')
export class Post {
@PrimaryColumn("integer")
id: number;
}
表结构:
+-----------+-----------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------+-----------------------------------------------------------------------------------------------------------------+
| post_test | CREATE TABLE `post_test` (
`id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-----------+-----------------------------------------------------------------------------------------------------------------+
第一个参数为字符串,则为表名
测试3:
import {Column, Entity} from "../../../src/index";
import {PrimaryColumn} from "../../../src/decorator/columns/PrimaryColumn";
import {Generated} from "../../../src/decorator/Generated";
@Entity({
name:'post_test1',
engine:'myisam'
})
export class Post {
@PrimaryColumn("integer")
id: number;
}
表结构:
+------------+------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+------------------------------------------------------------------------------------------------------------------+
| post_test1 | CREATE TABLE `post_test1` (
`id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+------------+------------------------------------------------------------------------------------------------------------------+
当第一个参数为对象时,则为选项,name属性为表名,设置了引擎为MyISAM,只有mysql支持引擎
测试4:
import {Column, Entity} from "../../../src/index";
import {PrimaryColumn} from "../../../src/decorator/columns/PrimaryColumn";
import {Generated} from "../../../src/decorator/Generated";
@Entity({
name:'post_test1',
engine:'myisam',
skipSync:true
})
export class Post {
@PrimaryColumn("integer")
id: number;
}
这个实体跳过了连接的同步步骤,没有生成表