当前位置: 首页 > news >正文

东城网站设计网页如何设计跑马灯效果

东城网站设计,网页如何设计跑马灯效果,做论坛推广的网站,建设一个怎样的自己的网站首页OneToOne 是 TypeORM 中用于定义实体间一对一关系的装饰器,适用于两个实体间存在严格唯一对应关系的场景(如用户与身份证、订单与发票)。以下是其核心用法和关键配置: 基础用法 1. 单向一对一关系 场景:仅在一个实体中…

@OneToOne 是 TypeORM 中用于定义实体间一对一关系的装饰器,适用于两个实体间存在严格唯一对应关系的场景(如用户与身份证、订单与发票)。以下是其核心用法和关键配置:

基础用法

1. 单向一对一关系

场景:仅在一个实体中定义对另一个实体的引用。

// User.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToOne } from 'typeorm';
import { Profile } from './Profile.entity';@Entity()
export class User {@PrimaryGeneratedColumn()id: number;@Column()name: string;// 单向关联(User 知道 Profile,但 Profile 不知道 User)@OneToOne(() => Profile)profile: Profile;
}// Profile.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';@Entity()
export class Profile {@PrimaryGeneratedColumn()id: number;@Column()bio: string;
}

数据库结果

  • User 表会新增一个外键列(如 profileId),指向 Profile 表的主键。

2. 双向一对一关系

场景:两个实体相互引用对方,需通过 @JoinColumn 指定关系所有者。

// User.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm';
import { Profile } from './Profile.entity';@Entity()
export class User {@PrimaryGeneratedColumn()id: number;@Column()name: string;// 双向关联(User 是关系所有者)@OneToOne(() => Profile, (profile) => profile.user)@JoinColumn() // 必须指定,否则会报错profile: Profile;
}// Profile.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToOne } from 'typeorm';
import { User } from './User.entity';@Entity()
export class Profile {@PrimaryGeneratedColumn()id: number;@Column()bio: string;// 反向引用(非必须,但推荐以支持双向查询)@OneToOne(() => User, (user) => user.profile)user: User;
}

数据库结果

  • 外键列仅在关系所有者(User)的表中生成(如 profileId)。

关键配置

1. @JoinColumn 详解

  • 作用:指定关系所有者,并定义外键列名。
  • 必填性:在双向关系中,必须在关系所有者一侧添加。
  • 自定义外键名
    @OneToOne(() => Profile, (profile) => profile.user)
    @JoinColumn({ name: 'custom_profile_id' }) // 自定义外键列名
    profile: Profile;
    

2. 级联操作(Cascade)

通过 cascade 选项自动管理关联实体的生命周期:

@OneToOne(() => Profile, (profile) => profile.user, {cascade: true, // 自动保存/更新/删除关联实体onDelete: 'CASCADE', // 数据库级联删除(可选)
})
@JoinColumn()
profile: Profile;

3. 通过主键关联(类似 JPA @MapsId

场景:当关联实体的外键与主键相同时(如 Client.id = User.id)。

// Client.entity.ts
import { Entity, PrimaryColumn, OneToOne, JoinColumn } from 'typeorm';
import { User } from './User.entity';@Entity()
export class Client {@PrimaryColumn() // 必须使用 @PrimaryColumn 而非 @PrimaryGeneratedColumnid: number;@OneToOne(() => User, { primary: true }) // primary: true 表示通过主键关联@JoinColumn({ name: 'id' }) // 外键列名与主键相同user: User;
}

查询操作

1. 加载关联数据

  • 隐式加载(需配置 eager: true):
    @OneToOne(() => Profile, (profile) => profile.user, { eager: true })
    profile: Profile;
    
  • 显式加载(推荐):
    const user = await userRepository.find({relations: ['profile'], // 加载关联的 profile
    });
    

2. 查询构建器(QueryBuilder)

const user = await userRepository.createQueryBuilder('user').leftJoinAndSelect('user.profile', 'profile') // 左连接并选择 profile.where('user.id = :id', { id: 1 }).getOne();

完整示例

// User.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm';
import { Profile } from './Profile.entity';@Entity()
export class User {@PrimaryGeneratedColumn()id: number;@Column()name: string;@OneToOne(() => Profile, (profile) => profile.user, {cascade: true,onDelete: 'CASCADE',})@JoinColumn()profile: Profile;
}// Profile.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToOne } from 'typeorm';
import { User } from './User.entity';@Entity()
export class Profile {@PrimaryGeneratedColumn()id: number;@Column()bio: string;@OneToOne(() => User, (user) => user.profile)user: User;
}// 使用示例
async function createUserWithProfile() {const profile = new Profile();profile.bio = 'TypeORM Expert';const user = new User();user.name = 'Alice';user.profile = profile; // 自动级联保存await userRepository.save(user);
}async function getUserWithProfile(id: number) {const user = await userRepository.findOne({where: { id },relations: ['profile'], // 加载关联数据});console.log(user?.profile?.bio); // 输出: TypeORM Expert
}

常见问题

  1. 外键列未生成

    • 检查是否在关系所有者一侧添加了 @JoinColumn
    • 确保实体已正确同步到数据库(运行迁移或重新启动应用)。
  2. 循环依赖

    • 避免在双向关系的装饰器回调中直接引用对方实体(如 @OneToOne(() => Profile, (profile) => profile.user) 是安全的,但循环导入模块会导致问题)。
  3. 性能优化

    • 对频繁查询的关联数据使用 eager: true@RelationId 装饰器。
    • 对复杂查询使用 QueryBuilder 以减少 N+1 问题。
http://www.dtcms.com/a/426271.html

相关文章:

  • 网站建设创业企业网站建设admin
  • 衡水建个网站多少钱制作自己的网站多少钱
  • 网站建设Skype打不开wordpress留言板源码
  • 做一个小网站多少钱江西冰溪建设集团网站
  • 电商网站开发需要掌握哪些知识技能购物网站备案费用
  • 小视频解析网站怎么做一级a做爰片51网站
  • 加强局门户网站建设展馆展示设计公司排名前十名
  • 网站建设知识学习心得大连网站建设咨询
  • 安阳网站制作优化如何用dw做网站
  • 汽车最专业的网站建设网站首页菜单栏模块怎么做的
  • 网站设计 wordpress网站建设必须要主机吗
  • 苏州网站建设主页外贸网站建设网站优化
  • 门户网站建设评标办法如何让百度快速收录
  • 威海经区建设局网站简单建设网站
  • 做网站的公司吉林市政建设招标网站有哪些
  • 国外的素材网站望野博物馆观后感
  • 做网站方面的问题做ui的网站有哪些
  • 昆山做网站公司哪家好网站上传
  • 西湖网站建设建筑公司网站宣传建筑工地文案范文图片
  • 网站公司图片梅州建站联系方式
  • 知名网站规划78创业商机网
  • 腾讯网站建设费用外贸seo优化公司
  • 网站开发项目的需求分析响应式网页设计原理
  • 注册网站域名网页设计基础填空题及答案
  • 珠海的网站建设计算机培训机构排名
  • 怎做视频网站成品网站w灬源码伊园
  • 建筑招聘网站哪个好杨浦网站建设 网站外包
  • 安庆做网站的公司做电影的网站赚什么钱
  • 中国建设银行的网站色彩linux建设网站
  • 彩票网站开发租用久久建筑网资料全吗