Saltar al contenido

TypeORM, Entidad de consulta basada en propiedad de relación

Puede que se de el caso de que encuentres alguna incompatibilidad en tu código o trabajo, recuerda probar siempre en un ambiente de testing antes aplicar el código al trabajo final.

find/findOne no permite filtrar por propiedades de relaciones anidadas. Ir por QueryBuilder en cambio con algo como

const x = await repo.createQueryBuilder("foo")
    .innerJoinAndSelect("foo.parent", "parent")
    .where("parent.name = :name",  name )
    .getOne()

Marque aquí para una pregunta similar.

Existe una solución para el filtrado basado en campos de relación para findOne()/find() métodos que he descubierto recientemente. El problema con el filtrado de campos de tabla relacionados solo existe para ObjectLiteral-estilo wheretiempo string las condiciones funcionan perfectamente.

Supongamos que tenemos dos entidades: User y Roleel usuario pertenece a un rol, el rol tiene muchos usuarios:

@Entity()
export class User 
  name: string;

  @ManyToOne(() => Role, role => role.users)
  role: Role;


@Entity()
export class Role 
  @OneToMany(() => User, user => user.role)
  users: User[];

Ahora podemos llamar findOne()/find() métodos de EntityManager o repositorio:

roleRepository.find(
  join:  alias: 'roles', innerJoin:  users: 'roles.users'  ,
  where: qb => 
    qb.where( // Filter Role fields
      a: 1,
      b: 2
    ).andWhere('users.name = :userName',  userName: 'John Doe' ); // Filter related field
  
);

Puede omitir el join parte si has marcado tu relación como ansiosa.

Comentarios y calificaciones

Si guardas algún recelo o forma de reformar nuestro noticia puedes ejecutar una crítica y con mucho gusto lo analizaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *