Reputation: 33
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
Reputation: 89
Seems like you need to use JoinColumn
decorator.
class Post /*...*/ {
/*...*/
@ManyToOne(() => User)
@JoinColumn({ referencedColumnName: "userUuid" })
userUuid!: string;
/*...*/
}
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