Eu tenho uma entidade de localização segurando coordenadas. Com base em um raio, quero obter todos os locais dentro do alcance.
Criei uma função (código de back-end / lógica Nestjs, não banco de dados) calculando a distância entre dois locais. Se a distância calculada for menor ou igual ao raio, desejo selecionar este local.
Minha implementação atual do repositório usando esta função de cálculo de distância:
// ...
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();
}
}
O exemplo mostrado acima não funciona. Eu recebo este erro
QueryFailedError: a função distanceFromCoordinatesInKilometros (precisão dupla, precisão dupla, desconhecida, desconhecida) não existe
Ao adicionar um :
à função, recebo este erro
O parâmetro de função não é suportado nos parâmetros. Por favor, verifique o parâmetro "distance".
Como eu chamaria minha função de código de back-end distanceFromCoordinatesInKilometers
nessa consulta? Eu posso passar variáveis mas não funções?
Atualmente estou usando um banco de dados Postgres, mas seria incrível se houver uma solução independente.
node.js
aplicativo a partir do banco de dados, isso nunca vai funcionar, uma solução universal seria: implementar essa função no banco de dados (por exemplo, por migrações) ou mais soluções independentes de driver: implementar essa função na sua consultaRespostas:
OK Se você implementou o seguinte em seu código, é necessário avaliar a função antes de passá-la para a string SQL. Então simplesmente:
fonte
location.latitude, location.longitude