Versão do TypeORM: 0.3.21
Notei que, ao especificar relações aninhadas na cláusula where findOptions do TypeORM, ele gera automaticamente os JOINs necessários. Gostaria de confirmar se isso é um recurso intencional ou um efeito colateral não documentado.
Pesquisei na documentação e nos problemas, mas não consegui encontrar uma descrição clara desse comportamento específico. Sou novo no TypeORM, então peço desculpas se isso já estiver documentado em algum lugar que eu não tenha mencionado. Qualquer informação de alguém familiarizado com o funcionamento interno do TypeORM será muito apreciada.
Exemplo de código:
const user = await manager.findOne(User, {
where: {
department: {
company: {
name: 'test',
},
},
},
})
SQL gerado:
SELECT DISTINCT
`distinctAlias`.`User_id` AS `ids_User_id`
FROM
(
SELECT
/* only User table columns */
FROM
`user` `User`
LEFT JOIN `department` `User__User_department` ON `User__User_department`.`department_id` = `User`.`department_id`
AND (
`User__User_department`.`deleted_at` IS NULL
)
LEFT JOIN `company` `c5f78c10915c4173cfd9951235c1b6b329194b87` ON `c5f78c10915c4173cfd9951235c1b6b329194b87`.`company_id` = `User__User_department`.`company_id`
AND (
`c5f78c10915c4173cfd9951235c1b6b329194b87`.`deleted_at` IS NULL
)
WHERE
(
(
(
(
(
(
(
`c5f78c10915c4173cfd9951235c1b6b329194b87`.`name` = 'test'
)
)
)
)
)
)
)
AND (`User`.`deleted_at` IS NULL)
) `distinctAlias`
ORDER BY
`User_id` ASC
LIMIT
1
Como mostrado acima, mesmo sem especificar explicitamente as relações, os JOINs são gerados automaticamente apenas usando objetos aninhados na cláusula where.
Sim, os
JOIN
s são intencionais. Você pode encontrar alguns exemplos na documentação das Opções de Localização . Aqui está um exemplo relevante:É útil pensar nas tabelas subjacentes do banco de dados quando se trata de relações — não sou um usuário recente do TypeORM, mas sabia que a resposta era "sim" apenas considerando as relações e consegui encontrar a documentação relevante para confirmar isso.
Por exemplo, no seu caso,
user
,department
, e ,company
são provavelmente três tabelas separadas (pelo que posso perceber sem ver o esquema, já que você não o forneceu). Com base na consulta resultante, você pode dizer que:user
tabela tem umadepartment_id
coluna,department
tabela tem umacompany_id
coluna ecompany
tabela tem umaname
colunaPortanto, para obter um
company
name
dado auser
, você precisaria percorrer a relaçãouser
-> e a relação -> . Para isso, você pode usar as tabelas juntas em uma consulta ou várias consultas sequenciais (possivelmente em uma transação, se atomicidade for necessária). O TypeORM oferece a opção de escolher entre as duas, com o padrão sendo .department
department
company
JOIN
relationLoadStrategy
"join"
1. Qual usar é uma pergunta diferente que você pode pesquisar, mas, resumidamente, a primeira tende a ser mais convencional e qual opção é mais rápida tende a ser um grande "depende". Aqui está uma pergunta existente do SO sobre o tópico, com 14 respostas no momento da escrita: Consultas JOIN vs. consultas múltiplas