首页 > 其他分享 >一对一 typeorm

一对一 typeorm

时间:2024-04-14 18:00:27浏览次数:20  
标签:profile Profile JoinColumn 一对一 Column User typeorm user

一对一

一对一是一种 A 只包含一个 B 实例,而 B 只包含一个 A 实例的关系。 我们以UserProfile实体为例。

用户只能拥有一个配置文件,并且一个配置文件仅由一个用户拥有。

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

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

@Column()
gender: string;

@Column()
photo: string;
}
 
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from "typeorm";
import { Profile } from "./Profile";

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

@Column()
name: string;

@OneToOne(() => Profile)
@JoinColumn()
profile: Profile;
}
 

这里我们将@OneToOne添加到profile并将目标关系类型指定为Profile。 我们还添加了@JoinColumn,这是必选项并且只能在关系的一侧设置。 你设置@JoinColumn的哪一方,哪一方的表将包含一个"relation id"和目标实体表的外键。

此示例将生成以下表:

+-------------+--------------+----------------------------+
| profile |
+-------------+--------------+----------------------------+
| id | int(11) | PRIMARY KEY AUTO_INCREMENT |
| gender | varchar(255) | |
| photo | varchar(255) | |
+-------------+--------------+----------------------------+

+-------------+--------------+----------------------------+
| user |
+-------------+--------------+----------------------------+
| id | int(11) | PRIMARY KEY AUTO_INCREMENT |
| name | varchar(255) | |
| profileId | int(11) | FOREIGN KEY |
+-------------+--------------+----------------------------+
 

同样,@JoinColumn必须仅设置在关系的一侧且必须在数据库表中具有外键的一侧。

该例子展示如何保存这样的关系:

const profile = new Profile();
profile.gender = "male";
profile.photo = "me.jpg";
await connection.manager.save(profile);

const user = new User();
user.name = "Joe Smith";
user.profile = profile;
await connection.manager.save(user);
 

启用级联后,只需一次save调用即可保存此关系。

要加载带有配置文件的用户,必须在FindOptions中指定关系:

const userRepository = connection.getRepository(User);
const users = await userRepository.find({ relations: ["profile"] });
 

或者使用QueryBuilder:

const users = await connection
.getRepository(User)
.createQueryBuilder("user")
.leftJoinAndSelect("user.profile", "profile")
.getMany();
 

通过在关系上启用预先加载,你不必指定关系或手动加入,它将始终自动加载。

关系可以是单向的和双向的。 单向是仅在一侧与关系装饰器的关系。 双向是与关系两侧的装饰者的关系。

我们刚刚创建了一个单向关系。 让我们将它改为双向:

import { Entity, PrimaryGeneratedColumn, Column, OneToOne } from "typeorm";
import { User } from "./User";

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

@Column()
gender: string;

@Column()
photo: string;

@OneToOne(() => User, user => user.profile) // 将另一面指定为第二个参数
user: User;
}
 
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from "typeorm";
import { Profile } from "./Profile";

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

@Column()
name: string;

@OneToOne(() => Profile, profile => profile.user) // 指定另一面作为第二个参数
@JoinColumn()
profile: Profile;
}
 

我们只是创建了双向关系。 注意,反向关系没有@JoinColumn。 @JoinColumn必须只在关系的一侧且拥有外键的表上。

双向关系允许你使用QueryBuilder从双方加入关系:

const profiles = await connection
.getRepository(Profile)
.createQueryBuilder("profile")
.leftJoinAndSelect("profile.user", "user")
.getMany();

标签:profile,Profile,JoinColumn,一对一,Column,User,typeorm,user
From: https://www.cnblogs.com/sexintercourse/p/18134457

相关文章

  • 问Typeorm -转换响应
    问Typeorm-转换响应 ENStackOverflow用户提问于 2021-01-0922:16:00回答1查看463关注0票数0我将Typeorm与NestJS一起使用,有没有办法将动态值传递到列转换器中?我有这个post实体文件:exportclassPostextendsEntityBase{@PrimaryGeneratedCo......
  • Flink 流数据处理 基于Flink1.12.0版本 MapFunction 只适用于一对一的转换,而 FlatMap
    Flink流数据处理基于Flink1.12.0版本MapFunction只适用于一对一的转换,而FlatMapFunction中可以一对多,或者多对一序言基于官网教程整理的一个教程。基于Flink1.12.0版本。目前该版本的Flink支持的source与sink如下所示参考资料:https://ci.apache.org/projects/flink......
  • 如何用typeORM制作复杂的嵌套WHERE条件?
    如何用typeORM制作复杂的嵌套WHERE条件?2023-02-1812:00:38 other 阅读:1320本文介绍了如何用typeORM制作复杂的嵌套WHERE条件?的处理方法,对大家解决问题具有一定的参考价值问题描述我有多个嵌套的WHERE条件,希望使用TypeORM生成它们时不会有太多代码重复。SQLWHERE条件应如......
  • typeorm mysql blob 存储base64
    typeormmysqlblob存储base64在TypeORM中,要将Base64数据存储到MySQL数据库的BLOB字段,您需要先将Base64字符串转换为Buffer,然后使用TypeORM的实体管理器来保存。以下是一个简单的例子:首先,定义您的实体:  import{Entity,PrimaryGeneratedColumn,Column}from......
  • typeorm mysql 存储base64
    在TypeORM中使用MySQL存储Base64数据时,可以将Base64字符串转换为二进制数据并存储在BLOB字段中。以下是一个简单的例子:首先,确保你的实体有一个适当的列类型,比如blob。import{Entity,PrimaryGeneratedColumn,Column}from'typeorm';@Entity()exportclassMyEntity{@Pr......
  • 一对一源码,前端页面权限和按钮权限控制
    一对一源码,前端页面权限和按钮权限控制页面权限是一对一源码后台系统中非常常见的需求,在前端实现页面权限和按钮权限是为了确保用户只能访问其有权访问的页面,并执行其有权执行的操作。本文介绍前端实现页面权限和按钮权限控制的流程和逻辑。1.获取用户当前权限并且存在全......
  • 一对一视频app开发,如何分块加载大文件?
    一对一视频app开发,如何分块加载大文件?后端:使用Koa2实现分块传输首先,在一对一视频app开发中,我们需要设置后端以支持分块传输编码。以下是使用Koa2的示例代码:constKoa=require("koa");constfs=require("fs");constapp=newKoa();app.use(async(ctx)=>......
  • 一对一直播软件开发,node大文件上传的断点续传
    一对一直播软件开发,node大文件上传的断点续传实现思路整体思路比较简单,拿到文件,保存文件唯一性标识,切割文件,分段上传,每次上传一段,根据唯一性标识判断文件上传进度,直到文件的全部片段上传完毕。下面的内容都是伪代码读取文件内容:constinput=document.querySelecto......
  • 一对一关系
    一对一关系一对一关系比较少,一般用于表的扩展例如一张用户表,有很多字段那么就可以把它拆分为两张表,常用的字段放主表,不常用的字段放详情表表结构搭建typeUserstruct{IDuintNamestringAgeintGenderboolUserInfoUserInfo//通过UserI......
  • Eloquent 模型使用详解 Has One Through 远程一对一
    远程一对一也好,经过型,穿过型一对一也好,都能表示这种模型的关联方式:一种非直接的关系定义这里使用官方的例子:......