【问题标题】:Typeorm Insert Foreign Key by StringTypeorm 按字符串插入外键
【发布时间】:2021-07-28 17:45:24
【问题描述】:

当用户注册时,我希望他发送他的帐户名,所以我将有“帐户”表参考用户实体。我正在使用 Nest.js。 我正在我的 users.service.ts 注册方法中寻找以下逻辑的替代方法:

  1. 按名称查找帐户
  2. 如果找不到帐户,请创建它
  3. 使用上面找到的帐户创建用户

这是我的帐户实体:

  @Entity()
  export class Account extends BaseEntity {
    @PrimaryGeneratedColumn('uuid')
    id: string;
  
    @Column({ unique: true })
    name: string;
  
    @Column()
    @CreateDateColumn()
    createdAt: Date;
  }

还有我的用户实体:

@Entity() 
export class User extends BaseEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  @Column()
  password: string;

  @ManyToOne(() => Account, (Account) => Account.name, { cascade:true })
  @JoinColumn({name: 'name'})
  account: Account;
}

我的 CreateUserDTO:

export class CreateUserDto {
  @IsEmail()
  email: string;

  @IsNotEmpty()
  password: string;

  @IsNotEmpty()
  account: string;
}

这是我尝试执行User.create(dto) 时的错误: Type 'string' is not assignable to type 'Account | DeepPartial<Account>'.

另外,由于某种原因,User.create(dto) 返回用户数组而不是单个用户,我不明白为什么。

【问题讨论】:

    标签: nestjs typeorm


    【解决方案1】:

    你可以这样继续:

    // create-user.dto.ts
    
    export class CreateUserDto {
      @IsEmail()
      email: string;
    
      @IsString()
      @IsNotEmpty()
      password: string;
    
      @IsString()
      @IsNotEmpty()
      accountName: string;
    }
    
    
    @Entity()
    export class User extends BaseEntity {
        @PrimaryGeneratedColumn('uuid')
        id: string;
    
        @Column({ unique: true })
        email: string;
    
        @Column()
        password: string;
    
        @Column()
        name: string; // This is your relations between user and account defined in JoinColumn decorator
    
        @ManyToOne(() => Account, (Account) => Account.name, { cascade: true })
        @JoinColumn({ name: 'name' })
        account: Account;
    }
    
    
    // user.service.ts
    
    // user.service.ts
    @Injectable()
    export class UserService {
        constructor(
            @InjectRepository(Account)
            private readonly accountRepository: Repository<Account>, // Or your custom repository
            @InjectRepository(User)
            private readonly userRepository: Repository<User> // Or your custom repository
        ) {}
    
        public async register(dto: CreateUserDto): Promise<void> {
            let accountToSaveWithUser: Account;
            // First check if account exist
            const account = await this.accountRepository.findOne({
                where: {
                    name: dto.accountName,
                },
            });
    
            if (isNil(account)) {
                const accountToSave = this.accountRepository.create({
                    name: dto.accountName,
                });
                accountToSaveWithUser = await this.accountRepository.save(accountToSave);
            } else {
                accountToSaveWithUser = account;
            }
    
            await this.userRepository.save({
                email: dto.email,
                password: hash(dto.password), // Use your package for hash password
                name: accountToSaveWithUser.name,
            });
        }
    }
    

    【讨论】:

    • 谢谢。我希望找到一种无需开发帐户创建/查找的方法。听起来像是一个很常见的用例(当你想要一个只有 id + value 的表时)
    猜你喜欢
    • 2021-11-02
    • 2012-07-30
    • 2021-09-24
    • 2019-11-20
    • 2013-10-27
    • 1970-01-01
    • 2022-10-06
    • 2019-09-16
    • 1970-01-01
    相关资源
    最近更新 更多