关联关系概览
iBest ORM 提供了完整的关联关系支持,让您能够轻松处理复杂的数据关系。
🏗️ 核心架构
关联注解体系
@HasOne
- 一对一关联@HasMany
- 一对多关联@BelongsTo
- 多对一关联@ManyToMany
- 多对多关联
查询 DSL
With()
/Preload()
- 预加载关联数据FirstWithRelations()
/FindWithRelations()
- 关联查询方法
延迟加载机制
LazyLoader
- 延迟加载代理EnableLazyLoading()
- 启用延迟加载
级联操作管理
CascadeManager
- 级联操作管理器- 集成到
Create
、DeleteByEntity
、Save
等核心方法
🚀 快速开始
1. 定义关联关系
typescript
import {
Table,
Field,
FieldType,
HasOne,
HasMany,
BelongsTo,
} from "@ibestservices/ibest-orm";
@Table({ name: "users" })
class User {
@Field({ type: FieldType.INTEGER, tag: ["primaryKey", "autoIncrement"] })
id: number;
@Field({ type: FieldType.TEXT, tag: ["notNull"] })
name: string;
@HasMany({
target: () => Order,
foreignKey: "user_id",
})
orders: Order[];
@HasOne({
target: () => Profile,
foreignKey: "user_id",
})
profile: Profile;
}
@Table({ name: "orders" })
class Order {
@Field({ type: FieldType.INTEGER, tag: ["primaryKey", "autoIncrement"] })
id: number;
@Field({ type: FieldType.INTEGER, tag: ["notNull"] })
user_id: number;
@Field({ type: FieldType.REAL })
amount: number;
@BelongsTo({
target: () => User,
foreignKey: "user_id",
})
user: User;
}
2. 关联查询
typescript
// 预加载关联数据
const users = await orm
.Session(User)
.With(["orders", "profile"])
.FindWithRelations();
// 延迟加载
const user = new User();
this.orm.Session(User).Where("id", 1).First(user);
// 启用延迟加载,返回代理对象
const lazyUser = this.orm.EnableLazyLoading(user);
// 加载orders关联
const orders = this.orm.LoadRelation(lazyUser, "orders");
3. 级联操作
typescript
// 级联创建
const userWithData = new User();
userWithData.name = "张三";
userWithData.orders = [{ amount: 100 }];
userWithData.profile = { bio: "简介" };
await orm.Create(userWithData, { cascade: true });
// 级联删除
await orm.DeleteByEntity(user, { cascade: true });
// 级联更新
user.orders.push(newOrder);
await orm.Save(user, { cascade: true });
📚 详细文档
基础概念
- 基础关联 - 关联类型和配置
查询策略
数据操作
- 级联操作 - 自动处理关联数据
具体关联类型
- Has One - 一对一关联
- Has Many - 一对多关联
- Belongs To - 多对一关联
- Many To Many - 多对多关联
⚡ 性能优化
选择合适的加载策略
场景 | 推荐策略 | 原因 |
---|---|---|
列表页面 | 预加载 | 减少查询次数 |
详情页面 | 延迟加载 | 按需加载数据 |
数据创建 | 级联操作 | 自动处理关联 |
批量操作 | 预加载 + 级联 | 平衡性能和便利性 |
避免常见问题
typescript
// ❌ N+1 查询问题
const users = await orm.Find(User);
for (const user of users) {
const orders = await user.orders; // 每次都查询
}
// ✅ 使用预加载
const users = await orm.Session(User).With("orders").FindWithRelations();
// ❌ 过深的关联嵌套
const users = await orm
.Session(User)
.With("orders.items.product.category.parent")
.FindWithRelations();
// ✅ 合理的关联深度
const users = await orm
.Session(User)
.With(["orders.items", "profile"])
.FindWithRelations();
📖 最佳实践
- 合理设计关联结构 - 避免过深的嵌套
- 选择合适的加载策略 - 根据使用场景选择预加载或延迟加载
- 谨慎使用级联删除 - 避免意外删除重要数据
开始探索 iBest ORM 的强大关联功能,构建高效的数据访问层!