Eu estou tentando criar uma relação manytomany com um campo personalizado seguindo a TypeORM documentação. Você pode vê-lo na relação entre a empresa, externalApp e ExternalAppCompanies. Mas, eu não posso obter os dados corretamente.
Abaixo está o meu código:
Empresa.entidade.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.entidade.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.entidade.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;
}
Quando eu tentar obter dados utilizando findOne, como este:
this.companyRepository.findOne({ where: { id: id }, relations: ['users', 'external_app_companies'] })
este é o resultado:
"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"
}
]
}
Verifique o external_app_companies objeto, ele não está trazendo os dados do externalApp relação e gostaria de obter todos os dados da entidade. Alguém pode me ajudar por favor?