Я использую 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({})
декоратора.