TypeOrm: ER_DUP_FIELDNAME: повторяющееся имя столбца в самообращающихся отношениях - PullRequest
0 голосов
/ 12 января 2020

Я использую Nest Js с отношением, которое ссылается на себя (parent <-> child). Я хочу отправить запрос с указанием родителя в ответе. (например, /projects?join=parentProject).

Это прекрасно работает, пока я не включу параметр limit (например, /projects?join=parentProject&limit=10). После сбоя запроса с этим SQL сообщением об ошибке:

[Nest] 31189 - 01/12/2020, 4:18:44 PM [ExceptionsHandler] ER_DUP_FIELDNAME: Duplicate column name 'parent_id' +3745ms

Я обнаружил, что следующий запрос отправляется в БД. parent_id не имеет префикса, поэтому встречается двойное имя столбца.

SELECT DISTINCT `distinctAlias`.`Project_id` as "ids_Project_id"
FROM (SELECT `Project`.`id`         AS `Project_id`,
             `Project`.`name`       AS `Project_name`,
             `parentProject`.`id`   AS `parentProject_id`,
             `parentProject`.`name` AS `parentProject_name`,
             `Project`.`parent_id`,
             `parentProject`.`parent_id`
      FROM `project` `Project` LEFT JOIN `project` `parentProject` 
                               ON `parentProject`.`id` = `Project`.`parent_id`) `distinctAlias`
ORDER BY `Project_id` ASC
LIMIT 10

Как это исправить?


Мой контроллер Nest JS выглядит следующим образом:

@Crud({
  model: {
    type: Project,
  },
  query: {
    join: {
      parentProject: {},
    },
    alwaysPaginate: true,
  },
})
@Controller('projects')
export class ProjectController implements CrudController<Project> {

  constructor(
    public readonly service: ProjectService,
  ) {}
}

Вот мой класс сущности:

@Entity()
export class Project {

  @PrimaryGeneratedColumn()
  readonly id: number;

  @ManyToOne(type => Project, project => project.childProjects)
  @JoinColumn({ name: 'parent_id' })
  parentProject: Project;

  @OneToMany(type => Project, project => project.parentProject)
  childProjects: Project[];
}

Вот так выглядит моя таблица базы данных:

create table if not exists project
(
    id int auto_increment primary key,
    parent_id int null,
    name varchar(255) null,
)
engine=MyISAM charset=utf8;

Другая информация: Если я сделаю запрос проекты вручную, он работает нормально.

this.service
  .find({
    relations: ['parentProject'],
    take: 10,
  });  // Works fine

Так что я думаю, это должно что-то делать с опциями внутри @Crud({}) декоратора.

...