【问题标题】:FindOne in ManyToMany relation with a custom field TypeORM + NestJS多对多关系中的 FindOne 与自定义字段 TypeORM + NestJS
【发布时间】:2022-01-02 08:36:26
【问题描述】:

我正在尝试使用 TypeORM 文档之后的自定义字段创建多对多关系。 您可以在 company、externalApp 和 ExternalAppCompanies 之间的关系中看到它。 但是,我无法正确获取数据。

下面是我的代码:

Company.entity.ts

import { ExternalApp } from 'src/modules/external/external-apps/entities/external-app.entity';
import { Group } from 'src/modules/group/entities/group.entity';
import { User } from 'src/modules/user/entities/user.entity';
import { justNumbers } from 'src/utils/utils';
import {
  BeforeInsert,
  Column,
  CreateDateColumn,
  DeleteDateColumn,
  Entity,
  JoinTable,
  ManyToMany,
  OneToMany,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
} from 'typeorm';
import { SharedEntityProps } from '../../../utils/sharedEntityProps';
import { ExternalAppCompanies } from '../../external/external-apps/entities/external-app-companies.entity';

export enum CompanyStatus {
  ENABLED = 'ENABLED',
  DISABLED = 'DISABLED',
}

@Entity({ name: 'companies' })
export class Company extends SharedEntityProps {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({
    type: 'enum',
    enum: CompanyStatus,
    default: CompanyStatus.ENABLED,
  })
  status: CompanyStatus;

  @Column()
  name: string;

  @Column()
  cnpj: string;

  @Column()
  razao_social: string;

  @Column({ nullable: true })
  email: string;

  @Column({ nullable: true })
  phone: string;

  @Column()
  address_street: string;

  @Column()
  address_number: string;

  @Column()
  address_zip_code: string;

  @Column({ nullable: true })
  address_cod_ibge: string;

  @Column({ nullable: true })
  address_city: string;

  @Column({ nullable: true })
  address_state: string;

  @Column({ nullable: true })
  address_country: string;

  @Column({ default: '#005193' })
  theme_primary: string;

  @Column({ default: '#ec2027' })
  theme_secondary: string;

  @ManyToMany((type) => User, (user) => user.companies)
  @JoinTable({ name: 'companies_users' })
  users: User[];

  @OneToMany(() => Group, (group) => group.company)
  groups: Group[];

  @OneToMany(() => ExternalAppCompanies, (app) => app.company)
  external_app_companies: ExternalAppCompanies[];

  @BeforeInsert()
  private beforeInsert = () => {
    //grava só com os números
    this.cnpj = justNumbers(this.cnpj);
    this.address_zip_code = justNumbers(this.address_zip_code);
    this.phone = justNumbers(this.phone);
  };
}

externalApps.entity.ts

import { Company } from 'src/modules/company/entities/company.entity';
import {
  Column,
  CreateDateColumn,
  DeleteDateColumn,
  Entity,
  JoinColumn,
  ManyToOne,
  OneToMany,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
} from 'typeorm';
import { SharedEntityProps } from '../../../../utils/sharedEntityProps';
import { ExternalAppCompanies } from './external-app-companies.entity';

export enum ExternalAppStatus {
  ENABLED = 'ENABLED',
  DISABLED = 'DISABLED',
}

@Entity({ name: 'external_apps' })
export class ExternalApp extends SharedEntityProps {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column()
  name: string;

  @Column({
    type: 'enum',
    enum: ExternalAppStatus,
    default: ExternalAppStatus.ENABLED,
  })
  status: ExternalAppStatus;

  @Column()
  description: string;

  @Column({ default: '/external-apps/default.png' })
  image: string;

  @OneToMany(() => ExternalAppCompanies, (extComp) => extComp.externalApp)
  companies: ExternalAppCompanies[];
}

externalAppCompanies.entity.ts


import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
import { Company } from '../../../company/entities/company.entity';
import { ExternalApp } from './external-app.entity';

export enum ExternalAppCompaniesEnum {
  ENABLED = 'ENABLED',
  DISABLED = 'DISABLED',
  NOT_CONFIGURED = 'NOT_CONFIGURED',
}

@Entity({ name: 'external_app_companies' })
export class ExternalAppCompanies {
  @ManyToOne(() => Company, (company) => company.external_app_companies, { primary: true })
  @JoinColumn({ name: 'company_id' })
  company: Company;

  @ManyToOne(() => ExternalApp, (extApp) => extApp.companies, { primary: true })
  @JoinColumn({ name: 'external_app_id' })
  externalApp: ExternalApp;

  @Column({ type: 'enum', enum: ExternalAppCompaniesEnum, default: ExternalAppCompaniesEnum.NOT_CONFIGURED })
  status: ExternalAppCompaniesEnum;
}

当我尝试像这样使用 findOne 获取数据时:

this.companyRepository.findOne({ where: { id: id }, relations: ['users', 'external_app_companies'] })

这是结果:

    "created_at": "2021-11-16T22:30:22.122Z",
    "updated_at": "2021-11-17T13:30:36.192Z",
    "deleted_at": null,
    "id": "ad1c8047-54e0-4ac5-9f8d-d23e4e1a4491",
    "status": "ENABLED",
    "name": "Test",
    "cnpj": "12341234",
    "razao_social": "Test SA",
    "email": "test@test.com.br",
    "phone": "132132132",
    "address_street": "Test Street",
    "address_number": "1754",
    "address_zip_code": "11234",
    "address_cod_ibge": null,
    "address_city": "São Paulo",
    "address_state": "São Paulo",
    "address_country": "Brazil",
    "theme_primary": "#000000",
    "theme_secondary": "#E6E6E6",
    "users": [
        {
            "created_at": "2021-11-11T17:28:33.217Z",
            "updated_at": "2021-11-11T17:28:33.217Z",
            "deleted_at": null,
            "id": "19573ba7-05b1-4d53-82ae-b3306cf9d9e1",
            "name": "admin",
            "status": "ENABLED",
            "admin": true,
            "email": "admin",
            "user_totvs": null
        }
    ],
    "external_app_companies": [
        {
            "status": "NOT_CONFIGURED"
        },
        {
            "status": "NOT_CONFIGURED"
        },
        {
            "status": "NOT_CONFIGURED"
        }
    ]
}

检查 external_app_companies 对象,它没有从 externalApp 关系中获取数据,我想从该实体获取所有数据。有人可以帮帮我吗?

【问题讨论】:

  • company 表中没有 company_id 尝试将其更改为 id。
  • 对不起,我无法获取,请更改为您指的是哪个表中的 id?
  • 在 ExternalAppCompanies 类下。 JoinColumn 是否引用相关表列?
  • 我认为这不是问题,在我的情况下,我将 joinColumn 的名称设置为“company_id”,但如果不这样做,我猜 typeorm 会使用名称“companyId”创建它company 表中也不存在。尽管如此,我还是会尝试删除这个名称集。
  • 是的,同样的问题。我想没有办法使用 findOne 方法解决它。

标签: javascript node.js postgresql nestjs typeorm


【解决方案1】:

我找到了一种使用 createQueryBuilder 方法从关系中获取所有数据的方法。

this.companyRepository
      .createQueryBuilder('company')
      .innerJoinAndSelect('company.users', 'users')
      .leftJoinAndSelect('company.external_app_companies', 'external_app_companies')
      .leftJoinAndSelect('external_app_companies.externalApp', 'external_apps')
      .where('company.id = :id', { id })
      .getOne();

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 2021-10-17
    • 2020-09-01
    • 2021-12-23
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    相关资源
    最近更新 更多