typescript - 保存manyToMany关系Typeorm的许多实例的问题
问题描述
描述
非常感谢您提前。使用@joinTable指定表名和列名时,多实例的save方法不起作用,只保存第一个
我有一个多对多关系(N-> N),当用户有几个用户可以有几种类型时,我有以下表格:
表用户:
列 | 类型 |
---|---|
ID | uuidv4 |
姓名 | 细绳 |
电子邮件 | 细绳 |
表 users_types:
列 | 类型 |
---|---|
ID | uuidv4 |
姓名 | 细绳 |
描述 | 细绳 |
表 users_users_types:
列 | 类型 |
---|---|
ID | uuidv4 |
用户身份 | uuid |
user_type_id | uuid |
型号: 用户:
import {
Column,
CreateDateColumn,
DeleteDateColumn,
Entity,
JoinTable,
ManyToMany,
PrimaryColumn,
UpdateDateColumn,
} from "typeorm";
import { TypeUser } from "@modules/accounts/infra/typeorm/entities/TypeUser";
@Entity("users")
class User {
@PrimaryColumn()
id?: string;
@Column()
name: string;
@Column({ unique: true })
email: string;
@ManyToMany((type) => TypeUser, (type_user) => type_user.users, {
cascade: true,
})
@JoinTable({
name: "users_types_users",
joinColumns: [{ name: "user_id", referencedColumnName: "id" }],
inverseJoinColumns: [{ name: "user_type_id", referencedColumnName: "id" }],
})
types?: TypeUser[];
@CreateDateColumn()
created_at?: Date;
@UpdateDateColumn()
updated_at?: Date;
@DeleteDateColumn()
deleted_at?: Date;
}
export { User };
类型用户:
import {
Column,
CreateDateColumn,
DeleteDateColumn,
Entity,
JoinTable,
ManyToMany,
PrimaryColumn,
UpdateDateColumn,
} from "typeorm";
import { User } from "./User";
@Entity("types_users")
class TypeUser {
@PrimaryColumn()
id?: string;
@Column()
name: string;
@Column()
active: boolean;
@ManyToMany((type) => User, (user) => user.types)
users?: User[];
@CreateDateColumn()
created_at?: Date;
@UpdateDateColumn()
updated_at?: Date;
@DeleteDateColumn()
deleted_at?: Date;
}
export { TypeUser };
我正在组装种子以使用以下代码测试插入:
import { getConnection, MigrationInterface, QueryRunner } from "typeorm";
import { TypeUser } from "@modules/accounts/infra/typeorm/entities/TypeUser";
import { User } from "@modules/accounts/infra/typeorm/entities/User";
import { UsersTypesFactory } from "@shared/infra/typeorm/factories";
export class CreateUsersTypes1620665114995 implements MigrationInterface {
public async up(): Promise<void> {
const users = (await getConnection("seed")
.getRepository("users")
.find()) as User[];
const usersTypesFactory = new UsersTypesFactory();
const types = usersTypesFactory.generate();
await getConnection("seed").getRepository("types_users").save(types);
const types_list = (await getConnection("seed")
.getRepository("types_users")
.find()) as TypeUser[];
const types_users_list = Array.from({
length: types_list.length,
}).map((_, index) => types_list[index]) as TypeUser[];
users[0].types = types_users_list;
const relationshipUsersTypes = users[0];
await getConnection("seed")
.getRepository(User)
.save(relationshipUsersTypes);
}
public async down(): Promise<void> {
await getConnection("seed").getRepository("users_types_users").delete({});
await getConnection("seed").getRepository("types_users").delete({});
}
}
执行代码时,日志似乎是正确的:
query: START TRANSACTION
query: INSERT INTO "users_types_users"("user_id", "user_type_id") VALUES ($1, $2), ($3, $4), ($5, $6) -- PARAMETERS: ["8b90cacb-52bc-4635-bd2c-bc87d59b0d4d","9144899a-6380-4be6-8251-947b5bdccda9","8b90cacb-52bc-4635-bd2c-bc87d59b0d4d","7711c9a8-10c4-407d-a868-82234e85c614","8b90cacb-52bc-4635-bd2c-bc87d59b0d4d","581417e3-0790-4ea7-9bff-ca0f51bb16a4"]
query: COMMIT
query: INSERT INTO "migrations"("timestamp", "name") VALUES ($1, $2) -- PARAMETERS: [1620665114995,"CreateUsersTypes1620665114995"]
logger this instance save
User {
id: '8b90cacb-52bc-4635-bd2c-bc87d59b0d4d',
name: 'Brice',
last_name: 'Will',
cpf: 'xfpfnxowprx',
rg: '91r7aujxsl',
email: 'Toney.Bailey@hotmail.com',
password_hash: 'fe6eYzQXKp3kHyt',
birth_date: 2020-07-17T04:46:14.816Z,
created_at: 2021-05-12T05:43:22.064Z,
updated_at: null,
deleted_at: null,
types: [
TypeUser {
id: '9144899a-6380-4be6-8251-947b5bdccda9',
name: 'provider',
active: true,
created_at: 2021-05-12T05:43:22.291Z,
updated_at: null,
deleted_at: null
},
TypeUser {
id: '7711c9a8-10c4-407d-a868-82234e85c614',
name: 'client',
active: true,
created_at: 2021-05-12T05:43:22.291Z,
updated_at: null,
deleted_at: null
},
TypeUser {
id: '581417e3-0790-4ea7-9bff-ca0f51bb16a4',
name: 'admin',
active: true,
created_at: 2021-05-12T05:43:22.291Z,
updated_at: null,
deleted_at: null
}
]
}
但在数据库中只有第一个的内容被保存内容users_types_users
内容type_users 内容用户
预期行为
预期的结果是注册了所有可用的类型
实际行为
仅注册类型类实例的第一个元素
重现步骤
- 创建带有表的数据库
- 包括表中的数据
我的环境
依赖 | 版本 |
---|---|
操作系统 | |
Node.js 版本 | v14.16.1 |
打字稿版本 | v4.2.3 |
类型ORM版本 | v0.2.32 |
- [X]
postgres
我将此添加为错误,但是,如果有人已经遇到相同的问题或设法解决了,我想回答这个问题?
解决方案
推荐阅读
- css - 自定义工具提示 Bootstrap 4
- dsl - 如何重试请求,直到我使用空手道 dsl 获得有效的动态生成值作为响应
- javascript - 如何在谷歌地图api中为省或城市赋予一些颜色?
- docker - 错误:获取 https://registry-1.docker.io/v2/:net/http:Docker 中的 TLS 握手超时
- scons - WSL + Scons:没有这样的文件或目录
- ajax - HTTP 同步性
- jekyll - 在 Liquid (Jekyll) 中比较 forloop.index|modulo:4 和 0
- python - 如何在 python 中调用函数并且不再计算?
- android - Activity 和 Fragment 的不同 WindowSoftInputMode
- android - Android 构建错误:属性签名需要 InnerClasses 属性。检查 -keepattributes 指令