【问题标题】:TypeORM: save M:N relation with custom join table in one save callTypeORM:在一次保存调用中保存与自定义连接表的 M:N 关系
【发布时间】:2021-10-07 13:36:00
【问题描述】:

图书实体

@ObjectType()
@Entity({ name: 'books' })
export default class Book extends BaseEntity {
  @Field()
  @PrimaryGeneratedColumn()
  id: number;

  @Field()
  @Column()
  title: string;

  @Field(() => Author)
  @ManyToOne(() => Author, (author) => author.books, {
    onDelete: 'CASCADE',
  })
  @JoinColumn({ name: 'author_id' })
  author: Author;

  @ManyToMany(() => Category, {
    cascade: true,
    nullable: true,
  })
  @JoinTable({
    name: 'book_categories',
    joinColumn: {
      name: 'bookId',
      referencedColumnName: 'id',
    },
    inverseJoinColumn: {
      name: 'categoryId',
      referencedColumnName: 'id',
    },
  })
  categories: Category[];

  @Field(() => [BookCategory])
  @OneToMany(() => BookCategory, (bookCategory) => bookCategory.bookId, {
    cascade: true,
  })
  bookCategories: BookCategory[];
}

BookCategory 实体

@ObjectType()
@Entity({ name: 'book_categories' })
export class BookCategory {
  @Field()
  @Column({ nullable: true })
  isActive: boolean;

  @Column()
  @IsNotEmpty()
  @PrimaryColumn()
  bookId: number;

  @Column()
  @IsNotEmpty()
  @PrimaryColumn()
  categoryId: number;

  @Field(() => Book)
  @ManyToOne(() => Book, (book) => book.bookCategories, { cascade: true })
  book: Book;

  @Field(() => Category)
  @ManyToOne(() => Category, (category) => category.bookCategories, {
    cascade: true,
  })
  category: Category;
}

类别实体

mport { BookCategory } from '../bookCategory/book-category-entity';

@ObjectType()
@Entity({ name: 'categories' })
export default class Category extends BaseEntity {
  @Field()
  @PrimaryGeneratedColumn()
  id: number;

  @Field()
  @Column()
  title: string;

  @ManyToMany(() => Book, (book) => book.categories)
  books: Book[];

  @Field(() => [BookCategory])
  @OneToMany(() => BookCategory, (bookCategory) => bookCategory.category, {
    cascade: true,
  })
  bookCategories: BookCategory[];
}


我用sequelize 已经很久了,现在我正在探索typeorm。我想要做的是用一个有效载荷保存所有这三个实体,就像 sequelize。 例如在续集你可以做这样的事情


await User.create({
  username: 'p4dm3',
  points: 1000,
  profiles: [{
    name: 'Queen',
    User_Profile: {                                       // <-------------- JOIN TABLE
      selfGranted: true                                 // extra join table field
    }
  }]
}, {
  include: Profile
});

使用 typeorm 中的自定义连接表字段保存此类有效负载的最佳方法是什么?

【问题讨论】:

    标签: typescript sequelize.js typeorm


    【解决方案1】:

    在设置cascade: true 时考虑保存相关数据。这一切都在文档中:https://orkhan.gitbook.io/typeorm/docs/relations#cascades

    注意:不适用于自定义连接表。

    另请注意,使用cascade: true 通常不是一个好主意。例如,您需要小心不要通过保存空数组来意外擦除关系,或者不要保存重复数据。我更喜欢分别保存不同的东西。

    【讨论】:

    • 没有帮助。当 typeform 管理您的连接表时工作正常,只有这样我才能在单个保存中保存有效负载。我担心的是在连接表中保存带有额外字段的有效负载。与 sequelize 相比,文档也非常基础。
    • 哦,是的,它不适用于这样的自定义连接表。我认为没有任何方法可以让它发挥作用。只需单独保存即可。
    • 无论如何,我强烈建议在任何情况下单独保存。使用cascade: true
    • 我同意,但是一个好的 ORM 通过提供用户友好的关系 API 在内部处理此类嵌套创建/更新的事务,它使代码更具可读性和简洁的 IMO。无论如何,谢谢你的帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2011-12-22
    • 2021-01-04
    • 1970-01-01
    • 2019-07-20
    相关资源
    最近更新 更多