Zum Hauptinhalt springen

Benutzerdefinierte Repositories

Inoffizielle Beta-Übersetzung

Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →

Du kannst ein benutzerdefiniertes Repository erstellen, das spezifische Methoden für die Arbeit mit deiner Datenbank enthalten soll. Angenommen, wir möchten eine Methode findByName(firstName: string, lastName: string) implementieren, die Benutzer anhand ihres Vor- und Nachnamens sucht. Der optimale Platz für diese Methode wäre ein Repository, sodass wir sie via userRepository.findByName(...) aufrufen könnten. Dies lässt sich durch benutzerdefinierte Repositories realisieren.

Es gibt mehrere Ansätze, um benutzerdefinierte Repositories zu erstellen.

Wie erstellt man ein benutzerdefiniertes Repository?

Es ist gängige Praxis, eine Repository-Instanz einer global exportierten Variable zuzuweisen und diese variable app-übergreifend zu nutzen, zum Beispiel:

// user.repository.ts
export const UserRepository = dataSource.getRepository(User)

// user.controller.ts
export class UserController {
users() {
return UserRepository.find()
}
}

Um die Funktionalität von UserRepository zu erweitern, kannst du die .extend-Methode der Repository-Klasse verwenden:

// user.repository.ts
export const UserRepository = dataSource.getRepository(User).extend({
findByName(firstName: string, lastName: string) {
return this.createQueryBuilder("user")
.where("user.firstName = :firstName", { firstName })
.andWhere("user.lastName = :lastName", { lastName })
.getMany()
},
})

// user.controller.ts
export class UserController {
users() {
return UserRepository.findByName("Timber", "Saw")
}
}

Benutzerdefinierte Repositories in Transaktionen verwenden

Transaktionen haben ihren eigenen Ausführungsbereich: Sie besitzen jeweils eigenen Query Runner, Entity Manager und Repository-Instanzen. Daher funktioniert die Verwendung des globalen (DataSource-)Entity Managers und seiner Repositories nicht in Transaktionen. Um Abfragen korrekt im Transaktionskontext auszuführen, musst du den bereitgestellten Entity Manager und dessen getRepository-Methode nutzen. Für benutzerdefinierte Repositories innerhalb von Transaktionen musst du die withRepository-Methode der bereitgestellten Entity Manager-Instanz verwenden:

await connection.transaction(async (manager) => {
// in transactions you MUST use manager instance provided by a transaction,
// you cannot use global entity managers or repositories,
// because this manager is exclusive and transactional

const userRepository = manager.withRepository(UserRepository)
await userRepository.createAndSave("Timber", "Saw")
const timber = await userRepository.findByName("Timber", "Saw")
})