首页 > 解决方案 > 保存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 图片 内容用户 图片

预期行为

预期的结果是注册了所有可用的类型

实际行为

仅注册类型类实例的第一个元素

重现步骤

  1. 创建带有表的数据库
  2. 包括表中的数据

我的环境

依赖 版本
操作系统
Node.js 版本 v14.16.1
打字稿版本 v4.2.3
类型ORM版本 v0.2.32

我将此添加为错误,但是,如果有人已经遇到相同的问题或设法解决了,我想回答这个问题?

标签: typescriptpostgresqlmany-to-manytypeorm

解决方案


推荐阅读