web-dev-qa-db-ja.com

類似クエリTypeormを実行する方法

こんにちは私はそれらを持っているすべての結果を見つけようとしています。私はいくつかの方法を試しましたが、問題は何も機能しません。空の配列を返すだけです

  var data = await  getRepository(User)
                        .createQueryBuilder("user")
                        .where("user.firstName = %:name%", {name: firstName })
                .getMany();

そして、このようなもの

 var data = await  getRepository(User)
                            .createQueryBuilder("user")
                            .where("user.firstName like %:name%", {name: firstName })
                    .getMany();

しかし、何も機能していません。これらはすべて、空の配列を返します。誰かが助けてくれてありがとう

16
Gardezi

正しい方法は次のとおりです。

 var data = await getRepository(User)
                  .createQueryBuilder("user")
                  .where("user.firstName like :name", {name: '%' + firstName + '%' })
                  .getMany();
29
pleerock

TypeORMは、箱から出してLike関数を提供します。例 ドキュメントから:

import {Like} from "typeorm";

const loadedPosts = await connection.getRepository(Post).find({
    title: Like("%out #%")
});

あなたの場合:

var data = await getRepository(User).find({
    name: Like(`%${firstName}%`)
});
20
Gabriel Lupu

リポジトリのニーズをサポートするために.findメソッドをすでに使用している場合は、QueryBuilderに切り替えたくない場合があります。

FindConditionsを使用してLIKEフィルターを実装する簡単な方法があります。

this.displayRepository.find({ where: "Display.name LIKE '%someString%'" });

または大文字と小文字を区別しない場合(postgresの場合):

this.displayRepository.find({ where: "Display.name ILIKE '%someString%'" });

これはインジェクション攻撃の影響を受けやすいので、動的な値を明示的に保護する必要があることに注意してください。

1
GeorgiG

データベース関数を使用して連結することもできます。例えばpostgresでは:

 var data = await getRepository(User)
              .createQueryBuilder("user")
              .where("user.firstName like '%' || :name || '%'", {name: firstName })
              .getMany();
0
Carlos Júlio