查询构建器中的调用函数

时间:2020-04-24 06:16:53

标签: typeorm

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

我创建了一个函数(后端代码/ Nestjs逻辑,而不是数据库)来计算两个位置之间的距离。如果计算出的距离小于或等于半径,我要选择此位置。

我当前使用此距离计算功能的存储库实现:

-> { only_rental? }

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

QueryFailedError:function distanceFromCoordinatesInKilometers(double precision,double 精度,未知,未知)不存在

在函数中添加// ... 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(); } } 时出现此错误

参数不支持功能参数。请检查 “距离”参数。

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

目前,我正在使用Postgres数据库,但是如果有独立的解决方案,那就太好了。

1 个答案:

答案 0 :(得分:0)

确定如果要在代码中实现以下内容,则需要先评估函数,然后再将其传递给SQL字符串。很简单:

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