Eager- und Lazy-Relations
Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →
Eager-Relations
Eager-Relations werden automatisch geladen, wenn du Entitäten aus der Datenbank abrufst. Beispiel:
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[]
}
Beim Laden von Fragen musst du keine Joins angeben oder Relationen explizit laden. Sie werden automatisch geladen:
const questionRepository = dataSource.getRepository(Question)
// questions will be loaded with its categories
const questions = await questionRepository.find()
Eager-Relations funktionieren nur mit find*-Methoden.
Bei Verwendung von QueryBuilder sind Eager-Relations deaktiviert – hier musst du leftJoinAndSelect verwenden.
Eager-Relations können nur auf einer Seite der Beziehung verwendet werden.
Die Verwendung von eager: true auf beiden Seiten ist nicht erlaubt.
Lazy-Relations
Entitäten in Lazy-Relations werden erst geladen, wenn du darauf zugreifst.
Solche Relationen müssen den Typ Promise haben – der Wert wird in einem Promise gespeichert,
und beim Laden wird ebenfalls ein Promise zurückgegeben. Beispiel:
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 ist ein Promise. Das bedeutet, es handelt sich um eine Lazy-Relation, die nur ein Promise mit einem Wert speichern kann.
Beispiel zum Speichern solcher Relationen:
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)
Beispiel zum Laden von Objekten in Lazy-Relations:
const [question] = await dataSource.getRepository(Question).find()
const categories = await question.categories
// you'll have all question's categories inside "categories" variable now
Hinweis: Falls du aus anderen Sprachen (Java, PHP etc.) kommst und überall Lazy-Relations gewohnt bist – sei vorsichtig. Diese Sprachen sind nicht asynchron, und Lazy Loading wird anders implementiert, ohne Promises. In JavaScript und Node.JS musst du Promises verwenden, wenn du Lazy-Relations benötigst. Dies ist eine nicht standardisierte Technik und in TypeORM als experimentell eingestuft.