分离实体定义
编辑教程分离实体定义
定义架构
你可以使用装饰器在模型中定义实体及其列。 但有些人更喜欢在单独的文件中定义一个实体及其列,这些文件在TypeORM中称为"entity schemas"。
简单定义示例:
import {EntitySchema} from "typeorm";
export const CategoryEntity = new EntitySchema({
name: "category",
columns: {
id: {
type: Number,
primary: true,
generated: true
},
name: {
type: String
}
}
});
关系示例:
import {EntitySchema} from "typeorm";
export const PostEntity = new EntitySchema({
name: "post",
columns: {
id: {
type: Number,
primary: true,
generated: true
},
title: {
type: String
},
text: {
type: String
}
},
relations: {
categories: {
type: "many-to-many",
target: "category" // CategoryEntity
}
}
});
复杂示例:
import {EntitySchema} from "typeorm";
export const PersonSchema = new EntitySchema({
name: "person",
columns: {
id: {
primary: true,
type: "int",
generated: "increment"
},
firstName: {
type: String,
length: 30
},
lastName: {
type: String,
length: 50,
nullable: false
},
age: {
type: Number,
nullable: false
}
},
checks: [
{ expression: `"firstName" <> 'John' AND "lastName" <> 'Doe'` },
{ expression: `"age" > 18` }
],
indices: [
{
name: "IDX_TEST",
unique: true,
columns: [
"firstName",
"lastName"
]
}
],
uniques: [
{
name: "UNIQUE_TEST",
columns: [
"firstName",
"lastName"
]
}
]
});
如果要使实体类型安全,可以定义模型并在模式定义中指定它:
import {EntitySchema} from "typeorm";
export interface Category {
id: number;
name: string;
}
export const CategoryEntity = new EntitySchema<Category>({
name: "category",
columns: {
id: {
type: Number,
primary: true,
generated: true
},
name: {
type: String
}
}
});
扩展架构
当使用Decorator
方法时,很容易将基本列extend
为抽象类并简单地扩展它。
例如,在BaseEntity
中这样定义id
,createdAt
和updatedAt
列。 有关更多详细信息,请参阅具体表继承的文档
当使用 EntitySchema
方法时该方法便不可行。 但是,你可以使用Spread Operator
(...)来改善。
重新审视上面的 Category
示例。 你可能希望 extract
基本列描述并在其他模式中复用它,则可以通过以下方式完成:
import {EntitySchemaColumnOptions} from "typeorm";
export const BaseColumnSchemaPart = {
id: {
type: Number,
primary: true,
generated: true,
} as EntitySchemaColumnOptions,
createdAt: {
name: 'created_at',
type: 'timestamp with time zone',
createDate: true,
} as EntitySchemaColumnOptions,
updatedAt: {
name: 'updated_at',
type: 'timestamp with time zone',
updateDate: true,
} as EntitySchemaColumnOptions,
};
现在你可以在其他模式模型中使用BaseColumnSchemaPart
,如下所示:
export const CategoryEntity = new EntitySchema<Category>({
name: "category",
columns: {
...BaseColumnSchemaPart,
// CategoryEntity现在具有已定义的id,createdAt,updatedAt列!
// 此外,还定义了以下新字段
name: {
type: String
}
}
});
一定要将extended
列添加到Category
接口(例如,通过export interface Category extend Base Entity
)。
使用Schemas查询/插入数据
当然,你可以像使用装饰器一样在存储库或实体管理器中使用已定义的模式。
回顾先前定义的Category
示例(带有Interface
和CategoryEntity
模式)以获取一些数据或操纵数据库。
// 请求数据
const categoryRepository = getRepository<Category>(CategoryEntity);
const category = await categoryRepository.findOne(1); // category is properly typed!
// 插入一条新category到数据库
const categoryDTO = {
// 注意id是自动生成的,请参考上面的架构定义。
name: 'new category',
};
const newCategory = await categoryRepository.save(categoryDTO);
Mos固件,小电视必刷固件
ES6 教程
Vue.js 教程
JSON 教程
jQuery 教程
HTML 教程
HTML 5 教程
CSS 教程
CSS3 教程
JavaScript 教程
DHTML 教程
JSON在线格式化工具
JS在线运行
JSON解析格式化
jsfiddle中国国内版本
JS代码在线运行
PHP代码在线运行
Java代码在线运行
C语言代码在线运行
C++代码在线运行
Python代码在线运行
Go语言代码在线运行
C#代码在线运行
JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。
大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
选择支付方式:
立即支付
¥
9.99
无法付款,请点击这里
金额: 0 元
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟