Relacionamentos no TypeORM
Fala meus consagrados, tudo bem com vocês?
Hoje vamos abordar os relacionamentos no TypeORM.
Obs: Para ter melhor entendimento do conteúdo, você precisa ter um conhecimento básico de Banco de dados.
Meu post original: Relacionamentos no TypeORM
🔀 O que são os relacionamentos no TypeORM
Os relacionamentos ajudam você a trabalhar facilmente com entidades relacionadas. Existem vários tipos:
@OneToOne
: Um para um.@ManyToOne
: Muitos para um.@OneToMany
: Um para muitos.@ManyToMany:
Muitos para muitos.
📚 Opções nos relacionamentos
Existem várias opções que você pode especificar:
eager: boolean
: Se definido como true, a relação sempre será carregada com a entidade principal ao usar ofind()
ou oQueryBuilder
.cascade: boolean | ("insert" | "update")[]
: Se definido como true, o objeto relacionado será inserido e atualizado no banco de dados.onDelete: "RESTRICT"|"CASCADE"|"SET NULL”
: Especifica como a chave estrangeira deve se comportar quando o objeto referenciado é excluído.nullable: boolean
: Indica se a coluna desta relação pode ser nula ou não. Por padrão, é false.orphanedRowAction: "nullify" | "delete" | "soft-delete" | "disable"
: Quando um pai é salvo (cascata ativada) sem um filho(s) que ainda existem no banco de dados, isso controlará o que acontecerá com eles.nullify
: Removerá a chave de relação.delete
: Irá remover esses filhos do banco de dados.soft-delete
: Marcará os filhos como excluídos suavemente.disable
: Manterá a relação intacta.
Usando @JoinColumn
O @JoinColumn
não apenas especifica qual lado da relação contém a coluna de junção com uma chave estrangeira, mas também permite personalizar o nome da coluna de junção e o nome da coluna referenciada.
Quando definimos @JoinColumn
, ele cria automaticamente uma coluna no banco de dados chamada propertyName + referencedColumnName
. Por exemplo:
@OneToOne(type => Post)
@JoinColumn()
post: Post;
Este código criará uma coluna com o nome postId
no banco de dados. Se você deseja alterar esse nome, pode especificar um nome personalizado:
@OneToOne(type => Post)
@JoinColumn({ name: "card_id" })
post: Post;
As colunas de junção são sempre uma referência a algumas outras colunas (usando uma chave estrangeira). Por padrão, sua relação sempre se refere à coluna primária da entidade relacionada. Se você deseja criar relação com outras colunas da entidade relacionada - você também pode especificá-las em @JoinColumn
:
@OneToMany(type => Post)
@JoinColumn({ referencedColumnName: "title" })
post: Post;
A relação agora se refere à title, em vez de id. O nome da coluna para essa relação se tornará postTitle
.
Você também pode unir várias colunas. Observe que eles não fazem referência à coluna primária da entidade relacionada por padrão: você deve fornecer o nome da coluna referenciada.
@ManyToOne(type => Post)
@JoinColumn([
{ name: "post_id", referencedColumnName: "id" },
{ name: "author_id", referencedColumnName: "author_id" }
])
post: Post;
Usando @JoinTable
O @JoinTable
é usado para relações @ManyToMany
e descreve as colunas de junção da tabela de “junção”. Uma tabela de junção é uma tabela separada, especial, criada automaticamente pelo TypeORM com colunas que se referem às entidades relacionadas. Você pode alterar os nomes das colunas dentro das tabelas de junção e suas colunas referenciadas com @JoinColumn
: Você também pode alterar o nome da tabela de "junção" gerada.
@ManyToMany(type => Post)
@JoinTable({
name: "question_post",
joinColumn: {
name: "question",
referencedColumnName: "id"
},
inverseJoinColumn: {
name: "post",
referencedColumnName: "id"
}
})
post: Post[];
Se a tabela de destino tiver chaves primárias compostas, uma matriz de propriedades deverá ser enviada para @JoinTable
.
📖 Conclusão
Com base no que foi apresentado, analisamos com sucesso os vários tipos de relações no TypeORM.
Se você quiser ver mais conteúdo sobre TypeORM, temos um post no blog da fw7 que explica sobre Transformando valores no TypeORM
🔗 Referências
“Antes do software poder ser reutilizável ele primeiro tem de ser utilizável.” Ralph Johnson
Henrique Schroeder.