nest-typeorm-mysql:一对一关系设计与增删改查

文章问题导向

实体如何设计一对一关系?如何增删改查?

如果你都有了答案,可以忽略本文章,或去nest学习导图寻找更多答案


一对一关系

定义:一对一是一种 A 只包含一个 B ,而 B 只包含一个 A 的关系
其实就是要设计两个表:一张是主表,一张是副表,查找主表时,关联查找副表
有外键的表称之为副表,不带外键的表称之为主表
如:一个账户对应一个用户信息,主表是账户,副表是用户信息
如:一个用户对应一张用户头像图片,主表是用户信息,副表是头像地址

一对一实体设计

主表:

使用@OneToOne() 来建立关系
第一个参数:() => AvatarEntity, 和谁建立关系? 和AvatarEntity建立关系
第二个参数:(avatar) => avatar.user),和哪个字段联立关系? avatar就是AvatarEntity的别名,可随便写,和AvatarEntity的userinfo字段建立关系
第三个参数:RelationOptions关系选项,待更新

import {
   
  Column,
  Entity,
  PrimaryGeneratedColumn,
  OneToOne,
} from 'typeorm';
import {
    AvatarEntity } from './avatar.entity';

@Entity({
    name: 'users' })
export class UsersEntity {
   
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  username: string;

  @Column()
  password: string;

  @OneToOne(() => AvatarEntity, (avatar) => avatar.userinfo)
  avatar: AvatarEntity;
}

副表

参数:同主表一样
主要:根据@JoinColumn({ name: ‘user_id’ })来分辨副表,name是设置数据库的外键名字,如果不设置是userId

import {
   
  Entity,
  PrimaryGeneratedColumn,
  Column,
  OneToOne,
  JoinColumn,
} from 'typeorm';
import {
    UsersEntity } from './user.entity';

@Entity({
    name: 'avatar' })
export class AvatarEntity {
   
  @PrimaryGeneratedColumn()
  id: number;

  @Column({
    type: 'varchar' })
  url: string;

  @OneToOne(() => UsersEntity, (user) => user.avatar)
  @JoinColumn({
    name: 'userinfo_id' })
  userinfo: UsersEntity;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是使用 NestJS 和 TypeORM 操作 MySQL 数据库的 user 表的示例代码: 首先,你需要安装必要的依赖: ```bash npm install --save @nestjs/typeorm typeorm mysql ``` 接下来,创建一个 User 实体类,用于映射 user 表数据: ```typescript import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; @Column() age: number; @Column() email: string; } ``` 接着,在你的模块中导入 TypeORM 模块和 User 实体类,并配置 TypeORM 的连接信息: ```typescript import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { User } from './user.entity'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: 'password', database: 'test', entities: [User], synchronize: true, }), TypeOrmModule.forFeature([User]), ], }) export class AppModule {} ``` 现在,你可以在你的服务中注入 TypeORM 的 Repository 对象,并使用它来操作 user 表了: ```typescript import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { User } from './user.entity'; @Injectable() export class UserService { constructor( @InjectRepository(User) private readonly userRepository: Repository<User>, ) {} async findAll(): Promise<User[]> { return this.userRepository.find(); } async create(user: User): Promise<User> { return this.userRepository.save(user); } async update(user: User): Promise<User> { return this.userRepository.save(user); } async delete(id: number): Promise<void> { await this.userRepository.delete(id); } } ``` 上面的代码中,我们注入了 UserRepository 对象,并使用它提供的方法来实现了查询、新增、更新和删除 user 数据的操作。 希望这个示例代码对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值