Дублировать имя столбца с помощью TypeORM в Nestjs

#mysql #nestjs #typeorm

#mysql #nestjs #typeorm

Вопрос:

У нас есть 2 объекта: EstateIntegrationEntity и EstateEntity

Когда мы пытаемся использовать .findOne on estateIntegrationRepository , мы получаем следующую ошибку:

 [Nest] 5537   - 10/01/2020, 8:37:55 AM
[ExceptionsHandler] ER_DUP_FIELDNAME: Duplicate column name 'EstateIntegrationEntity_estate_id'  1590ms
QueryFailedError: ER_DUP_FIELDNAME: Duplicate column name 'EstateIntegrationEntity_estate_id'
    at ...
  

Мы создали OneToOne отношение от EstateIntegrationEntity к EstateEntity .

 import { EstateEntity } from "src/estates/estate.entity";
import { Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn, RelationId } from "typeorm";

@Entity({ name: 'estate_integrations' })
export class EstateIntegrationEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @RelationId((estateIntegrationEntity: EstateIntegrationEntity) => estateIntegrationEntity.estate)
  estate_id: number;

  @OneToOne(() => EstateEntity, { eager: true })
  @JoinColumn({ name: 'estate_id' })
  estate: EstateEntity;

  ...
}
  

И связь EstateEntity между EstateIntegrationEntity :

 import { EstateIntegrationEntity } from 'src/integrations/estate.integration.entity';
import { Column, Entity, JoinColumn, ManyToOne, OneToOne, PrimaryGeneratedColumn } from 'typeorm';

@Entity('estates')
export class EstateEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column('varchar' || null)
  uuid: string;

  @OneToOne(
    () => EstateIntegrationEntity,
    estate_integration => estate_integration.estate,
  )
  estate_integration: EstateIntegrationEntity;
}
  

Эта ошибка возникает только с .findOne() , а не с .find() :

 async findEstateById(id: string): Promise<EstateIntegrationEntity> {
  return await this.estateIntegrationRepository.findOne({
    where: {
      external_id: id
    }
  });
}
  

Ответ №1:

Вы можете изменить имя полей. У меня только что была аналогичная ошибка, и я исправил ее, изменив имя с помощью @Column({ name: ‘name_the_fields_with_different_name’ }). Потому что проблема в том, что если в таблицах у него одно и то же имя, когда он выполняет поиск, он должен иметь поля с тем же именем.

Ответ №2:

Для этого случая у вас есть 3 решения для этого:

1- измените имя столбца с ‘estate_id’ на что-нибудь еще, например ‘id_estate’

2- написать пользовательскую инструкцию join с помощью TypeORM

3- мое любимое решение — использовать стратегию имен следующим образом:

  • сначала install npm i --save typeorm-naming-strategies в вашем файле конфигурации typeorm
 const SnakeNamingStrategy = require('typeorm-naming-strategies')
  .SnakeNamingStrategy;
   module.exports = {
        name: 'name',
        type: 'mysql',
        host: 'localhost',
        port: 3306,
       ...
       namingStrategy: new SnakeNamingStrategy(),
    }