[英]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.