Repositorios personalizados
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
Puedes crear un repositorio personalizado que contenga métodos para trabajar con tu base de datos.
Por ejemplo, supongamos que queremos tener un método llamado findByName(firstName: string, lastName: string)
que busque usuarios por nombre y apellido específicos.
El mejor lugar para este método es un Repository,
para poder llamarlo como userRepository.findByName(...).
Esto se logra mediante repositorios personalizados.
Existen varias formas de crear repositorios personalizados.
¿Cómo crear un repositorio personalizado?
Es una práctica común asignar una instancia de repositorio a una variable exportada globalmente y usar esta variable en toda tu aplicación, por ejemplo:
// user.repository.ts
export const UserRepository = dataSource.getRepository(User)
// user.controller.ts
export class UserController {
users() {
return UserRepository.find()
}
}
Para extender la funcionalidad de UserRepository puedes usar el método .extend de la clase Repository:
// 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")
}
}
Uso de repositorios personalizados en transacciones
Las transacciones tienen su propio ámbito de ejecución: poseen su propio query runner, entity manager e instancias de repositorio.
Por eso, usar el entity manager global (del data source) y los repositorios globales no funcionará en transacciones.
Para ejecutar consultas correctamente en el ámbito de la transacción debes usar el entity manager proporcionado
y su método getRepository. Para utilizar repositorios personalizados dentro de una transacción,
debes usar el método withRepository de la instancia del entity manager proporcionada:
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")
})