Tengo una entidad de ubicación con coordenadas. Según un radio, quiero obtener todas las ubicaciones que estén dentro del alcance.
Creé una función (código de backend / lógica de Nestjs, no base de datos) que calcula la distancia entre dos ubicaciones. Si la distancia calculada es menor o igual al radio, quiero seleccionar esta ubicación.
Mi implementación actual de repositorio usando esta función de cálculo de distancia:
// ...
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();
}
}
El ejemplo que se muestra arriba no funciona. Me sale este error
QueryFailedError: la función distanceFromCoordinatesInKilometers (precisión doble, precisión doble, desconocido, desconocido) no existe
Al agregar un :
a la función me sale este error
El parámetro de función no es compatible con los parámetros. Por favor verifique el parámetro "distancia".
¿Cómo llamaría a mi función de código de fondo distanceFromCoordinatesInKilometers
dentro de esa consulta? ¿Puedo pasar variables pero no funciones?
Actualmente estoy usando una base de datos Postgres, pero sería increíble si hubiera una solución independiente.
node.js
aplicación desde la base de datos, eso nunca funcionará, una solución universal sería: implementar esa función en la base de datos (por ejemplo, por migraciones), o una solución más independiente del controlador: implementar esa función en su consultaRespuestas:
OK Si tuviera que implementar lo siguiente en su código, debe evaluar la función antes de pasarla a la cadena SQL. Tan simplemente:
fuente
location.latitude, location.longitude