Skip to content

关联关系概览

iBest ORM 提供了完整的关联关系支持,让您能够轻松处理复杂的数据关系。

🏗️ 核心架构

关联注解体系

  • @HasOne - 一对一关联
  • @HasMany - 一对多关联
  • @BelongsTo - 多对一关联
  • @ManyToMany - 多对多关联

查询 DSL

  • With() / Preload() - 预加载关联数据
  • FirstWithRelations() / FindWithRelations() - 关联查询方法

延迟加载机制

  • LazyLoader - 延迟加载代理
  • EnableLazyLoading() - 启用延迟加载

级联操作管理

  • CascadeManager - 级联操作管理器
  • 集成到 CreateDeleteByEntitySave 等核心方法

🚀 快速开始

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 });

📚 详细文档

基础概念

查询策略

数据操作

具体关联类型

⚡ 性能优化

选择合适的加载策略

场景推荐策略原因
列表页面预加载减少查询次数
详情页面延迟加载按需加载数据
数据创建级联操作自动处理关联
批量操作预加载 + 级联平衡性能和便利性

避免常见问题

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();

📖 最佳实践

  1. 合理设计关联结构 - 避免过深的嵌套
  2. 选择合适的加载策略 - 根据使用场景选择预加载或延迟加载
  3. 谨慎使用级联删除 - 避免意外删除重要数据

开始探索 iBest ORM 的强大关联功能,构建高效的数据访问层!