查询构建器中的调用函数

Que*_*n3r 11 typeorm

我有一个位置实体保存坐标。基于半径,我想获取范围内的所有位置。

我创建了一个函数(后端代码/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();
    }
}
Run Code Online (Sandbox Code Playgroud)

上面显示的示例不起作用。我收到这个错误

QueryFailedError: 函数 distanceFromCoordinatesInKilometers(double precision, double precision, unknown, unknown) 不存在

:函数添加 a时出现此错误

参数中不支持函数参数。请检查“距离”参数。

我将如何distanceFromCoordinatesInKilometers在该查询中调用我的后端代码函数?我可以传入变量但不能传入函数?

目前我正在使用 Postgres 数据库,但如果有一个独立的解决方案会很棒。

blu*_*yke -1

好的 如果您要在代码中实现以下内容,则需要在将函数传递给 SQL 字符串之前评估该函数。简单地说:

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