Vendure电商平台数据库实体开发指南
前言
在Vendure电商平台开发中,数据库实体是构建业务逻辑的基础组件。本文将详细介绍如何在Vendure中定义和使用自定义数据库实体,帮助开发者扩展平台功能。
什么是数据库实体
数据库实体是面向对象编程中表示数据库表结构的类。在Vendure中,实体使用TypeORM库进行定义和管理,每个实体类对应数据库中的一个表。
创建自定义实体
基本实体结构
以下是一个产品评价实体的完整示例:
import { DeepPartial } from '@vendure/common/lib/shared-types';
import { VendureEntity, Product, EntityId, ID } from '@vendure/core';
import { Column, Entity, ManyToOne } from 'typeorm';
@Entity()
class ProductReview extends VendureEntity {
constructor(input?: DeepPartial<ProductReview>) {
super(input);
}
@ManyToOne(type => Product)
product: Product;
@EntityId()
productId: ID;
@Column()
text: string;
@Column()
rating: number;
}
关键要点:
- 必须继承
VendureEntity
基类 - 使用
@Entity()
装饰器标记为TypeORM实体 - 构造函数支持部分初始化
常用装饰器解析
字段装饰器
-
@Column()
- 定义普通字段- 支持多种配置选项:
nullable
,default
,unique
等 - 数据类型根据TS类型自动推断
- 支持多种配置选项:
-
@EntityId()
- Vendure特有装饰器- 用于关联实体ID字段
- 自动适配数字和字符串ID类型
关系装饰器
-
@ManyToOne()
- 多对一关系- 如多个评价对应一个产品
- 需要指定目标实体类型
-
@OneToMany()
- 一对多关系 -
@OneToOne()
- 一对一关系 -
@ManyToMany()
- 多对多关系
注册实体到插件
定义好的实体需要在插件中注册:
import { VendurePlugin } from '@vendure/core';
import { ProductReview } from './entities/product-review.entity';
@VendurePlugin({
entities: [ProductReview],
})
export class ReviewsPlugin {}
数据库迁移
新增实体后必须创建数据库迁移:
- 实体变更后生成迁移文件
- 执行迁移更新数据库结构
- 这是TypeORM的标准流程
实体操作示例
在服务中使用实体进行CRUD操作:
@Injectable()
export class ReviewService {
constructor(private connection: TransactionalConnection) {}
async createReview(ctx: RequestContext, productId: string, rating: number, text: string) {
const product = await this.connection.getEntityOrThrow(ctx, Product, productId);
const review = new ProductReview({
product,
rating,
text,
});
return this.connection.getRepository(ctx, ProductReview).save(review);
}
}
关键点:
- 使用
TransactionalConnection
获取仓库 - 通过
getRepository
方法获取实体仓库 - 仓库提供标准的save/find/delete等方法
高级特性
自定义字段支持
Vendure 2.2+支持为自定义实体添加自定义字段:
export class CustomProductReviewFields {}
@Entity()
export class ProductReview extends VendureEntity implements HasCustomFields {
@Column(type => CustomProductReviewFields)
customFields: CustomProductReviewFields;
// 其他字段...
}
配置方式:
export const config: VendureConfig = {
customFields: {
ProductReview: [
{ name: 'reviewerName', type: 'string' },
],
},
};
货币字段处理
使用@Money()
装饰器处理货币字段:
- 与
MoneyStrategy
配合使用 - 支持可配置的存储格式
- 确保货币计算的准确性
最佳实践
- 实体命名采用大驼峰式
- 表名默认使用小写蛇形命名
- 为常用查询字段添加索引
- 合理设计实体关系
- 考虑性能影响设计字段类型
常见问题
Q: 为什么我的实体变更没有生效? A: 需要生成并执行数据库迁移
Q: 如何优化实体查询性能? A: 合理使用关系加载策略和索引
Q: 自定义字段有什么限制? A: 支持Vendure定义的所有自定义字段类型
总结
本文详细介绍了在Vendure电商平台中定义和使用自定义数据库实体的完整流程。通过合理设计实体结构,开发者可以灵活扩展平台功能,满足各种业务需求。掌握实体开发是Vendure插件开发的基础技能,建议结合实践加深理解。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考