#node.js #nestjs #typeorm
#node.js #nestjs #typeorm
Вопрос:
Я этого не понимаю. У меня есть служба, которая внедряет репозитории сущностей и имеет специальные методы для выполнения некоторой бизнес-логики и функций.
Кроме того, я предоставляю метод, который просто возвращает QueryBuilder
— чтобы избежать повсеместного внедрения репозиториев — в нескольких случаях, когда другой службе требуется просто быстрый запрос:
type EntityFields = keyof MyEntity;
entityQueryBuilder(alias?: string, id?: number, ...select: EntityFields[]) {
const q = this.entityRepository.createQueryBuilder(alias);
if (id) {
q.where({id});
}
if (select) {
q.select(select);
}
return q;
}
Теперь, когда я пытаюсь использовать это и вызываю:
const r = await service.entityQueryBuilder('a', 1, 'settings').getOne();
результат всегда пустой, хотя в журнале сгенерированный SQL правильный.
Однако, когда я делаю:
const r = await service.entityQueryBuilder('a', 1, 'settings').execute();
Я получаю (почти) то, что мне нужно. Я получаю массив вместо объекта entity напрямую, но данные есть.
Я недоволен, поскольку мне нужно сопоставить результат с объектом, который я хотел, что getOne()
должно быть сделано от моего имени. getMany()
также не возвращает результатов.
Что я сделал не так?
Редактировать:
FWIW вот окончательное решение, которое я придумал на основе подсказки в принятом ответе:
entityQueryBuilder(id?: number, ...select: EntityFields[]) {
const q = this.entityRepository.createQueryBuilder('alias');
if (id) {
q.where({id});
}
if (select) {
q.select(select.map(f => `alias.${f}`));
}
return q;
}
По общему признанию, он жестко alias
запрограммирован, но с этим я могу смириться и подходит для моей цели.
Надеюсь, это поможет кому-то в будущем.
Ответ №1:
Это происходит потому, что вы не указали действительно правильный выбор. В вашем случае вам нужно a.settings
вместо settings
:
const r = await service.entityQueryBuilder('a', 1, 'a.settings').getOne(); // it should works