Eager 和 Lazy 关系
编辑教程Eager 和 Lazy 关系
Eager 关系
每次从数据库加载实体时,都会自动加载 Eager 关系。 例如:
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[];
}
现在当你加载 questions 时,不需要加入或指定要加载的关系。它们将自动加载:
const questionRepository = connection.getRepository(Question);
// questions 将加载其类别 categories
const questions = await questionRepository.find();
Eager 关系只有在使用find *
方法时才有效。
如果你使用QueryBuilder
,则禁用 eager 关系,并且必须使用leftJoinAndSelect
来加载。
Eager 的关系只能用于关系的一方,在关系的两边使用eager:true
是不允许的。
Lazy 关系
当你访问的时候会加载 Lazy 关系中的实体。
这种关系必须有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. 这意味着它是 lazy 的,它只能存储一个带有值的 promise。
例如:
保存这种关系:
const category1 = new Category();
category1.name = "animals";
await connection.manager.save(category1);
const category2 = new Category();
category2.name = "zoo";
await connection.manager.save(category2);
const question = new Question();
question.categories = Promise.resolve([category1, category2]);
await connection.manager.save(question);
如何在 Lazy 关系中加载对象:
const question = await connection.getRepository(Question).findOne(1);
const categories = await question.categories;
// you'll have all question's categories inside "categories" variable now
注意:如果你来自其他语言(Java,PHP 等)并且习惯于在任何地方使用 lazy 关系,请小心使用。 这些语言不是异步的,延迟加载是以不同的方式实现的,这就是为什么不能使用 promises 的原因。 在 JavaScript 和 Node.JS 中,如果你想拥有延迟加载的关系,你必须使用 promises。 但是这是非标准技术,而且在 TypeORM 中被认为是实验性的。
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秒钟