typescript - Hvordan bruke leftJoinAndSelect-spørring i TypeORM postgres?
Jeg har brukt TypeORM og laget noen enheter som følger:
User.ts@PrimaryGeneratedColumn() id: numberPost.ts@PrimaryGeneratedColumn() id: number @Column() userId: number
Siden jeg ikke ønsket å lage relasjoner mellom User og Post-enheter, laget jeg bare en kolonne kalt userId i Post.
Her er spørsmålet.
Jeg vil gjerne slå sammen to tabeller og hente data. Men hvordan kan jeg bruke innerJoinAndSelect eller leftJoinAndSelect?
Her er koden min:
// getPost.ts
// Attempt 1
const first = await createQueryBuilder()
.select('user')
.from(User, 'user')
.leftJoinAndSelect(Post, 'post', 'post.userId = user.id')
.getMany() // only fetched User data without Post data
// Attempt 2
const second = await createQueryBuilder('user')
.innerJoinAndSelect('user.id', 'userId')
.innerJoinAndMap('user.id', Post, 'post', 'userId = post.userId')
.getMany() // Bad request error
Men ingen av disse fungerte...
Jeg vil gjerne koble User med Post og hente alle data (men ikke ved å bruke relasjon). Hvordan kan jeg få tak i disse dataene?
Svar #1
leftJoinAndMapOne skal fungere. Men du har nettopp utelatt det første argumentet mapToProperty.
Bare fikse din getPost.ts som dette
const first = await createQueryBuilder()
.select(‘user’)
.from(User, ‘user’)
// ------------------------ fixed ------------------------
.leftJoinAndMapOne(‘user.id’, Post, ‘post’, ‘post.userId = user.id’)
// -------------------------------------------------------
.getMany()
Svar #2
Siden du ikke ønsker å opprette fremmednøkkelrelasjoner i databasen, men fortsatt ønsker å bruke join-operasjoner på entitetene, kan du bruke createForeignKeyConstraints-egenskapen i relasjonsinnstillingene for å oppnå dette.
Oppdater enhetene dine som nedenfor:
Bruker.ts
@PrimaryGeneratedColumn()
id: number
@OneToMany(() => Post, (post) => post.user)
posts: Post[]
Post.ts
@PrimaryGeneratedColumn()
id: number
@Column()
userId: number
@ManyToOne(() => User, (user) => user.posts, { createForeignKeyConstraints: false })
@JoinColumn({ name: 'userId' })
user: User
Nå bør du kunne bruke find eller QueryBuilder-metoder på disse enhetene akkurat som om de hadde et faktisk forhold i databasen.
Jeg testet ikke denne koden, men dette er essensen av hva du bør gjøre. Håper dette hjelper. Skål 🍻 !!!
