【问题标题】:TypeORM relations and express类型ORM关系和表达
【发布时间】:2021-10-17 09:21:59
【问题描述】:

我正在与 TypeORM 和 MySQL 以及 Express 建立多对一、一对多关系。有两张表cold post和user。 一个用户有很多帖子。每个帖子都有一个用户。 我想使用 'userUuid' 列作为外键来加入这两个表。 谁能告诉我怎么解决?

谢谢

// 用户

 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 }
        }
      }

// 发布

 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 }
        }
      }

//表达

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

//表达

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

【问题讨论】:

    标签: javascript node.js reactjs express typeorm


    【解决方案1】:

    看来你需要使用JoinColumn装饰器。

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

    From TypeORM docs

    连接列始终是对其他一些列的引用(使用外键)。默认情况下,您的关系始终引用相关实体的主列。如果您想与相关实体的其他列创建关系 - 您也可以在 @JoinColumn 中指定它们:

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

    关系现在指的是类别实体的名称,而不是 id。该关系的列名将变为 categoryName。

    【讨论】:

    • 嗨。我使用了 JoinColumn 装饰器。 “@JoinColumn([{ name: 'userUuid' }, {referencedColumnName: 'userUuid' }])”如您在我的代码中所见。使用像 uuid 这样的东西作为外键似乎有点棘手。也许这不是一个好主意??如果我不使用 JoinColumn 装饰器将另一列称为外键,它就可以工作。所以我放弃了,照常工作。谢谢你的建议
    猜你喜欢
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    相关资源
    最近更新 更多