跳至主内容区

主动加载与延迟加载的关系

非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

主动加载关系

每次从数据库加载实体时,主动加载关系会自动加载。 例如:

import { Entity, PrimaryGeneratedColumn, Column, ManyToMany } from "typeorm"
import { Question } from "./Question"

@Entity()
export class Category {
@PrimaryGeneratedColumn()
id: number

@Column()
name: string

@ManyToMany((type) => Question, (question) => question.categories)
questions: Question[]
}
import {
Entity,
PrimaryGeneratedColumn,
Column,
ManyToMany,
JoinTable,
} from "typeorm"
import { Category } from "./Category"

@Entity()
export class Question {
@PrimaryGeneratedColumn()
id: number

@Column()
title: string

@Column()
text: string

@ManyToMany((type) => Category, (category) => category.questions, {
eager: true,
})
@JoinTable()
categories: Category[]
}

现在加载问题时,您无需额外连接或指定需要加载的关系。 这些关系将自动加载:

const questionRepository = dataSource.getRepository(Question)

// questions will be loaded with its categories
const questions = await questionRepository.find()

主动加载关系仅在您使用find*方法时生效。 如果使用QueryBuilder,主动加载功能将被禁用,必须改用leftJoinAndSelect来加载关系。 主动加载只能在关系的一侧启用, 在关系两侧同时设置eager: true是不允许的。

延迟加载关系

延迟加载关系中的实体在您访问时才会加载。 此类关系必须将Promise作为类型——您将值存储在Promise中, 加载时返回的也是Promise对象。例如:

import { Entity, PrimaryGeneratedColumn, Column, ManyToMany } from "typeorm"
import { Question } from "./Question"

@Entity()
export class Category {
@PrimaryGeneratedColumn()
id: number

@Column()
name: string

@ManyToMany((type) => Question, (question) => question.categories)
questions: Promise<Question[]>
}
import {
Entity,
PrimaryGeneratedColumn,
Column,
ManyToMany,
JoinTable,
} from "typeorm"
import { Category } from "./Category"

@Entity()
export class Question {
@PrimaryGeneratedColumn()
id: number

@Column()
title: string

@Column()
text: string

@ManyToMany((type) => Category, (category) => category.questions)
@JoinTable()
categories: Promise<Category[]>
}

categories是一个Promise。这意味着它是延迟加载的,且只能存储包含值的Promise。 保存此类关系的示例:

const category1 = new Category()
category1.name = "animals"
await dataSource.manager.save(category1)

const category2 = new Category()
category2.name = "zoo"
await dataSource.manager.save(category2)

const question = new Question()
question.categories = Promise.resolve([category1, category2])
await dataSource.manager.save(question)

访问延迟加载关系内对象的示例:

const [question] = await dataSource.getRepository(Question).find()
const categories = await question.categories
// you'll have all question's categories inside "categories" variable now

注意:如果您来自其他语言(如Java/PHP等)并习惯随处使用延迟加载——请务必谨慎。 这些语言非异步环境,其延迟加载通过不同技术实现(无需Promise)。 在JavaScript和Node.JS中,要实现延迟加载关系必须使用Promise。 这是非标准技术,在TypeORM中视为实验性功能。