クエリビルダー内で関数を呼び出す


8

座標を保持する位置エンティティがあります。半径に基づいて、範囲内にあるすべての場所を取得します。

2つの場所の間の距離を計算する関数(データベースではなくバックエンドコード/ Nestjsロジック)を作成しました。計算された距離が半径以下の場合、この場所を選択します。

この距離計算関数を使用した私の現在のリポジトリ実装:

// ...
import { distanceFromCoordinatesInKilometers } from '../shared/calculations/distanceFromCoordinatesInKilometers';

@EntityRepository(Location)
export class LocationsRepository extends Repository<Location> {
    public getLocations({ /* ... */ latitude, longitude, radiusInKilometers }: GetLocationsDTO): Promise<Location[]> {
        const query: SelectQueryBuilder<Location> = this.createQueryBuilder('location');

        // ....

        if(latitude && longitude && radiusInKilometers) {
             query.andWhere("distanceFromCoordinatesInKilometers(location.latitude, location.longitude, :latitude, :longitude) <= :radiusInKilometers", { 
                 latitude,
                 longitude,
                 radiusInKilometers, 
            });
        }

        return query.getMany();
    }
}

上記の例は機能しません。このエラーが発生する

QueryFailedError:関数distanceFromCoordinatesInKilometers(倍精度、倍精度、不明、不明)は存在しません

:関数にを追加すると、このエラーが発生します

関数パラメーターはパラメーターでサポートされていません。「距離」パラメータを確認してください。

distanceFromCoordinatesInKilometersそのクエリ内でバックエンドコード関数をどのように呼び出しますか?変数を渡すことはできますが、関数を渡すことはできませんか?

現在、私はPostgresデータベースを使用していますが、独立したソリューションがあればそれは素晴らしいでしょう。


2
基本的にnode.js、データベースからアプリから関数を呼び出そうとしていて、それが機能することは決してありません。普遍的な解決策は、データベースにその関数を実装する(たとえば、移行によって)か、よりドライバーに依存しないソリューション:その関数を実装することです。クエリで
広々とした

おかげで、クエリにその関数をどのように実装できますか?計算自体は大きなものです(30行のコード)
Question3r

1
あなたの質問はTypeORMそのものよりも、関連する多くのSQLですが、基本的な大円を使用していると仮定すると、その主旨のを見てみましょう微積分gist.github.com/rugbyprof/...
広々

そのリンクをありがとう。ここでそれをpastebin.com/AS7y7efrに翻訳してみましたが、エラーは発生しませんでした。しかし、その計算が正しいかどうかを確認する必要があります...
Question3r

1
PostgreSQL のPostGIS拡張機能を見たことはありますか?座標(ポイント)間の距離を決定する機能が含まれています。指定された座標から指定された距離内で行をフィルタリングするクエリを実行する方法の例については、gis.stackexchange.com / questions / 77072 /…を参照してください。
Timshel

回答:


0

OK次のコードをコードに実装する場合、SQL文字列に渡す前に関数を評価する必要があります。だから単純に:

if(latitude && longitude && radiusInKilometers) {
             query.andWhere(`${distanceFromCoordinatesInKilometers(location.latitude, location.longitude, :latitude, :longitude)} <= :radiusInKilometers`, { 
                 latitude,
                 longitude,
                 radiusInKilometers, 
            });
        }

すみません、あなたの答えが理解できませんでした。これは、TypeORMを使用したNestJs(TS付きノード)プロジェクトです。私のコードでは何をすべきですか?
Question3r

@ Question3r C編集
bluejayke

申し訳ありませんが、ここではデータベーステーブルから取得した現在の緯度値を関数が認識していないため、これは機能しませんlocation.latitude, location.longitude
Question3r
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.