Что не так с параметрами в моем предложении Typeorm WHERE для QueryBuilder? - PullRequest
1 голос
/ 19 марта 2019

Может кто-нибудь объяснить мне, что я делаю неправильно, когда использую параметры для моего предложения where?

Этот следующий блок выдает мне ошибку под ним:

@EntityRepository(Something)
export class SomethingRepository extends Repository<Something>{

  findByUserAndSomethingById(userId: number, spotId: number){
    const thing = this.createQueryBuilder('something')
    .where('something.userId = :id', {id: userId})
    .andWhere('something.id = :id',{id: spotId}).getOne();
    return thing;
  }
}
QueryFailedError: column something.userid does not exist

Этот запрос дает мне правильный результат.

@EntityRepository(Something)
export class SomethingRepository extends Repository<Something>{

  findByUserAndSomethingById(userId: number, spotId: number){
    const thing = this.createQueryBuilder('something')
    .where(`"something"."userId" = ${userId}`)
    .andWhere('something.id = :id',{id: spotId}).getOne();
    return thing;
  }
}

Обновление: пример репо для воспроизведения и выписка типа на github.

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Не могу точно сказать, поскольку этого не было в документации . Но когда я использую TypeORM QueryBuilder для выполнения запроса к SQL, обычно возникает необходимость добавить другие кавычки до и после псевдонима и имени поля.

Например, в вашем случае вам нужно использовать: .where('"something"."userId"' = :id', {id: userId}) как то, что вы использовали бы во втором примере: .where('"something"."userId"' = ${userId}).

Один из способов отладки, как правило, для проверки выполненного запроса, который не выполняется. Был ли выполнен весь запрос, как если бы вы выполняли его как обычно, или отсутствуют кавычки.

0 голосов
/ 21 марта 2019

Решение состоит в том, чтобы загрузить отношения моей сущности.Насколько я понимаю.

findByUserAndSomethingById(userId: number, spotId: number) {
    const thing = this.createQueryBuilder('something')
    .innerJoin('something.user', 'user')
      .where('user.id = :uid', { uid: userId })
      .andWhere('something.id = :sid', { sid: spotId }).getOne();
    return thing;
}

Спасибо @Mukyuu за все ваши усилия помочь мне.

...