繁体   English   中英

FindOne 在 ManyToMany 关系中与自定义字段 TypeOrm + Nestjs

[英]FindOne in ManyToMany relation with a custom field TypeOrm + Nestjs

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

下面是我的代码:

公司实体.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 object,它没有从 externalApp 关系中获取数据,我想从该实体获取所有数据。 有人能帮助我吗?

我找到了一种使用 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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM