FindOne v ManyToMany vztahu s vlastní pole TypeORM + NestJS

0

Otázka

Snažím se vytvořit manytomany vztahu s vlastní pole po TypeORM dokumentace. Můžete to vidět ve vztahu mezi společností, externalApp a ExternalAppCompanies. Ale, nemůžu získat data správně.

Níže je můj kód:

Společnost.subjektem.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.subjektem.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.subjektem.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;
}

Když se snažím dostat data pomocí findOne, jako je tento:

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

tohle je výsledek:

    "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"
        }
    ]
}

Podívejte se na external_app_companies objekt, to není přinášet data z externalApp vztahu a já bych rád, aby si všechny údaje z této účetní jednotky. Může mi někdo pomoci, prosím?

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

Nejlepší odpověď

0

Našel jsem způsob, jak dostat všechny údaje ze vztahu pomocí metodě 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-11-23 21:44:36

V jiných jazycích

Tato stránka je v jiných jazycích

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