Darth Vader
Darth Vader

Reputation: 33

TypeORM relations and express

I'm making Many to One, One to many relations with TypeORM and MySQL, and Express. There are two tables cold post and user. One user has many posts. and each post has one user. I would like to use 'userUuid' column as a foreign key to join these two tables. Can anybody tell me how to fix it?

Thank you

// user

 import {
        Entity,
        PrimaryGeneratedColumn,
        Column,
        BaseEntity,
        BeforeInsert,
        Generated,
        OneToMany,
        } from 'typeorm'
        import { v4 as uuid } from 'uuid'
    
        import { Post } from './Post'
        @Entity()
        export class User extends BaseEntity {
        @PrimaryGeneratedColumn()
        id!: number
      
        @Column()
        userId!: string
      
        @Column()
        @Generated('uuid')
        userUuid!: string
      
        @Column({ nullable: true })
        displayName!: string
        
        @Column({ nullable: true })
        email!: string
      
        @OneToMany(() => Post, (post: Post) => post.user)
        posts!: Post[]
      
        @BeforeInsert()
        createUuid() {
          this.userUuid = uuid()
        }
      
        toJSON() {
          return { ...this, id: undefined }
        }
      }

// post

 import {
        Entity,
        PrimaryGeneratedColumn,
        CreateDateColumn,
        UpdateDateColumn,
        Column,
        BaseEntity,
        Generated,
        BeforeInsert,
        ManyToOne,
        JoinColumn,
      } from 'typeorm'
      import { v4 as uuid } from 'uuid'
      import { User } from './User'
      @Entity()
      export class Post extends BaseEntity {
        @PrimaryGeneratedColumn()
        id!: number
      
        @Column()
        @Generated('uuid')
        postUuid!: string
      
        @Column({ nullable: true })
        userUuid!: string
      
        @CreateDateColumn({ nullable: true })
        createdAt!: Date
      
        @UpdateDateColumn({ nullable: true })
        updatedAt!: Date
      
        @Column({ nullable: true })
        content!: string
      
        @BeforeInsert()
        createUuid() {
          this.postUuid = uuid()
        }
      
        @ManyToOne(() => User, (user: User) => user.posts)
        user!: User
      
        @JoinColumn([{ name: 'userUuid' }, { referencedColumnName: 'userUuid' }])
        toJSON() {
          return { ...this, id: undefined }
        }
      }

//express

router
  .route('/')
  .get((req: Request, res: Response) => {
    User.find({ relations: ['posts'] })
      .then((data) => {
        res.send(data)
      })
      .catch((err) => res.send(err))
  })

//express

router
  .route('/')
  .get((req: Request, res: Response) => {
    Post.find({ relations: ['user'] })
      .then((data) => {
        res.send(data)
      })
      .catch((err) => res.send(err))
  })         

Upvotes: 0

Views: 893

Answers (1)

Leon
Leon

Reputation: 89

Seems like you need to use JoinColumn decorator.

class Post /*...*/ {
  /*...*/
  @ManyToOne(() => User)
  @JoinColumn({ referencedColumnName: "userUuid" })
  userUuid!: string;
  /*...*/
}

From TypeORM docs

Join columns are always a reference to some other columns (using a foreign key). By default your relation always refers to the primary column of the related entity. If you want to create relation with other columns of the related entity - you can specify them in @JoinColumn as well:

@ManyToOne(type => Category)
@JoinColumn({ referencedColumnName: "name" })
category: Category;

The relation now refers to name of the Category entity, instead of id. Column name for that relation will become categoryName.

Upvotes: 1

Related Questions