文章问题导向
实体如何设计一对一关系?如何增删改查?
如果你都有了答案,可以忽略本文章,或去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;
}