TypeORM: как обрабатывать необязательные запросы по идентификатору отношения - PullRequest
0 голосов
/ 09 июля 2020

У меня есть служба для получения пользовательского приложения, которая принимает необязательный параметр listingId (это отношение приложения) и имеет фиксированное предложение WHERE для user.id, равного единице из входящего аутентифицированного запроса:

@Injectable()
export class ApplicationsService {
  constructor(@Inject(REQUEST) private readonly request: any) {}

  async list(listingId?: string) {
    return Application.find({
      where: {
        user: { id: this.request.user.id },
        listing: { id: listingId }
      },
    })
  }
}

, к сожалению, реализация выше возвращает пустой массив. Вероятно, потому что { listing: { id: undefined } } приводит к запросу «IS NULL», верно ?. Я нашел обходной путь для этого:

@Injectable()
export class ApplicationsService {
  constructor(@Inject(REQUEST) private readonly request: any) {}

  async list(listingId?: string) {
    return Application.find({
      where: {
        user: { id: this.request.user.id },
        ...(listingId && { listing: { id: listingId } }),
      },
    })
  }
}

, но я ищу более общий / более приятный способ, поскольку в будущем у меня может быть более одного необязательного параметра, и необходимость распространять их, как это, некрасиво и подвержены ошибкам. Не говоря уже о том, что код не читается.

1 Ответ

0 голосов
/ 09 июля 2020

Услуга? Но какой фреймворк вы используете? Гнездо JS? Это вроде как выглядит, но не очень идиоматично. документы по адресу:

https://typeorm.io/# / select-query-builder

Вы можете разделить все на части для удобства чтения.

Например, начните с a const query = [...].createQueryBuilder('example'), а затем вы можете условно добавить предложения в свой query с помощью различных доступных методов (например, addSelect(), .where(), andWhere(), .innerJoin(), et c, et c) перед заканчивая .getOne(), .getRawOne(), .getMany(), .getRawMany().

Re TypeORM будьте осторожны, предполагая, как он обрабатывает undefined. Проверьте Not, IsNull, et c из пакета typeorm, если вы используете sh, чтобы быть явным в запросе find().

...