使用NestJS在Typeorm postgresql中的多对多/一种关系数组

时间:2020-10-02 08:05:18

标签: postgresql nestjs typeorm

我正在尝试构建一个系统,其中一个用户可以根据需要插入许多食谱,而一个食谱包含很多成分。然后一种成分有很多宏,这些宏来自一个api调用,我必须将它们一个接一个地插入以获得宏并增加它们的总和。

现在对于我的数据模型,我现在有3个实体。

用户实体:

import { Entity, PrimaryGeneratedColumn, Column, BeforeInsert, OneToMany } from "typeorm";
import { UserRole } from "./user.interface";
import { BlogEntryEntity } from "src/blog/model/blog-entry.entity";



@Entity()
export class UserEntity {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @Column({ unique: true })
    username: string;

    @Column({unique: true})
    email: string;

    @Column({select: false})
    password: string;

    @Column({type: 'enum', enum: UserRole, default: UserRole.USER})
    role: UserRole;

    @Column({nullable: true})
    profileImage: string;

    @OneToMany(type => BlogEntryEntity, blogEntryEntity => blogEntryEntity.author)
    blogEntries: BlogEntryEntity[];

    @BeforeInsert()
    emailToLowerCase() {
        this.email = this.email.toLowerCase();
    }
}

一个用户可以插入许多食谱:

import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  BeforeUpdate,
  ManyToOne,
} from 'typeorm';
import { UserEntity } from 'src/user/models/user.entity';

@Entity('blog_entry')
export class BlogEntryEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  @Column()
  slug: string;

  @Column('text', { array: true })
  ingr: string[];

  @Column({ default: '' })
  description: string;

  @Column({ default: '' })
  body: string;

  @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
  createdAt: Date;

  @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
  updatedAt: Date;

  @BeforeUpdate()
  updateTimestamp() {
    this.updatedAt = new Date();
  }

  @Column({ default: 0 })
  likes: number;

  @Column({ nullable: true })
  headerImage: string;

  @Column({ nullable: true })
  publishedDate: Date;

  @Column({ nullable: true })
  isPublished: boolean;

  @ManyToOne(
    type => UserEntity,
    user => user.blogEntries,
  )
  author: UserEntity;
}

并且食谱属于一个用户。 此食谱的ingr值代表食谱可以拥有的成分列表。

我应该为配料创建另一个表格,每种配料都有很多宏吗? 正在考虑这样的事情:

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class IngredientsEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column('text', { array: true })
  ingr: string[];

  @Column({ default: 0 })
  totalWeight: number;

  @Column({ default: 0 })
  dietLabels: string[];

  @Column({ default: 0 })
  calorieQuantity: number;

  @Column({ default: 0 })
  proteinQuantity: number;

  @Column({ default: 0 })
  carbQuantity: number;

  @Column({ default: 0 })
  fatQuantity: number;

  @Column({ default: 0 })
  sugarQuantity: number;
}

每次我插入一个ingr时,我都会增加属于该配方的配料列表的宏。 因此,一个配方具有许多宏,并且许多宏属于一个特定的配方。这种逻辑是正确的还是我应该拆分成分表和宏表?

将逻辑更新为: 更新逻辑以 我的食材更新为:

import { BlogEntryEntity } from 'src/blog/model/blog-entry.entity';
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm';

@Entity()
export class IngredientsEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ default: 0 })
  totalWeight: number;

  @Column({ default: 0 })
  dietLabels: string[];

  @Column({ default: 0 })
  calorieQuantity: number;

  @Column({ default: 0 })
  proteinQuantity: number;

  @Column({ default: 0 })
  carbQuantity: number;

  @Column({ default: 0 })
  fatQuantity: number;

  @Column({ default: 0 })
  sugarQuantity: number;

  @ManyToOne(
    type => BlogEntryEntity,
    blog => blog.ingredientsEntry,
  )
  ingr: BlogEntryEntity;
}

还有我的博客

import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  BeforeUpdate,
  ManyToOne,
  OneToMany,
} from 'typeorm';
import { UserEntity } from 'src/user/models/user.entity';
import { IngredientsEntity } from 'src/ingredients/models/ingredients.entity';

@Entity('blog_entry')
export class BlogEntryEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  @Column()
  slug: string;

  @Column('text', { array: true })
  ingr: string[];

  @Column({ default: '' })
  description: string;

  @Column({ default: '' })
  body: string;

  @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
  createdAt: Date;

  @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
  updatedAt: Date;

  @BeforeUpdate()
  updateTimestamp() {
    this.updatedAt = new Date();
  }

  @Column({ default: 0 })
  likes: number;

  @Column({ nullable: true })
  headerImage: string;

  @Column({ nullable: true })
  publishedDate: Date;

  @Column({ nullable: true })
  isPublished: boolean;

  @ManyToOne(
    type => UserEntity,
    user => user.blogEntries,
  )
  author: UserEntity;

  @OneToMany(
    type => IngredientsEntity,
    ingredientsEntity => ingredientsEntity.ingr,
  )
  ingredientsEntry: IngredientsEntity[];
}

不知道这种逻辑是否可以解决

0 个答案:

没有答案