FindOne în ManyToMany raport cu un domeniu personalizat TypeORM + NestJS

0

Problema

Încerc să creez o manytomany raport cu un domeniu personalizat în urma TypeORM de documentare. Îl puteți vedea în relația dintre societate, externalApp și ExternalAppCompanies. Dar, eu nu pot obține datele în mod corespunzător.

Mai jos este codul meu:

Compania.entitate.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.entitate.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.entitate.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;
}

Când am să încercați să obțineți date folosind findOne astfel:

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

acesta este rezultatul:

    "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": "[email protected]",
    "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"
        }
    ]
}

Verificați external_app_companies obiect, acesta nu este de a aduce datele din externalApp raport și aș dori pentru a obține toate datele din această entitate. Ma poate ajuta cineva va rog?

javascript nestjs node.js postgresql
2021-11-23 21:11:56
1

Cel mai bun răspuns

0

Am găsit o modalitate de a obține toate datele din raport folosind createQueryBuilder metodă.

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-11-23 21:44:36

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................