typescript - Hvordan bruke leftJoinAndSelect-spørring i TypeORM postgres?


Jeg har brukt TypeORM og laget noen enheter som følger:

  • User.ts
    @PrimaryGeneratedColumn()
    id: number
    
  • Post.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 🍻 !!!

Relaterte artikler