chức năng gọi trong trình xây dựng truy vấn


8

Tôi có một thực thể vị trí giữ tọa độ. Dựa trên bán kính tôi muốn có được tất cả các vị trí trong phạm vi.

Tôi đã tạo một hàm (mã phụ trợ / logic Nestjs, không phải cơ sở dữ liệu) tính toán khoảng cách giữa hai vị trí. Nếu khoảng cách tính toán nhỏ hơn hoặc bằng bán kính tôi muốn chọn vị trí này.

Triển khai kho lưu trữ hiện tại của tôi bằng cách sử dụng chức năng tính toán khoảng cách này:

// ...
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();
    }
}

Ví dụ hiển thị ở trên không hoạt động. Tôi gặp lỗi này

QueryFailedError: khoảng cách chức năngFromCoordLSInKilometer (độ chính xác kép, độ chính xác kép, không xác định, không xác định) không tồn tại

Khi thêm a :vào hàm tôi gặp lỗi này

Tham số chức năng không được hỗ trợ trong các tham số. Vui lòng kiểm tra tham số "khoảng cách".

Làm thế nào tôi có thể gọi hàm mã phụ trợ của mình distanceFromCoordinatesInKilometerstrong truy vấn đó? Tôi có thể vượt qua trong các biến nhưng không có chức năng?

Hiện tại tôi đang sử dụng cơ sở dữ liệu Postgres nhưng sẽ rất tuyệt nếu có một giải pháp độc lập.


2
về cơ bản, bạn đang cố gắng gọi một chức năng từ node.jsứng dụng của mình từ cơ sở dữ liệu, điều đó sẽ không bao giờ hoạt động, một giải pháp phổ quát sẽ là: thực hiện chức năng đó trong cơ sở dữ liệu (ví dụ: bằng cách di chuyển) hoặc giải pháp không thể điều khiển hơn: thực hiện chức năng đó trong truy vấn của bạn
Roomy

cảm ơn nhưng làm thế nào tôi thực hiện chức năng đó trong truy vấn của tôi? Bản thân phép tính là một số lớn (30 dòng mã)
Câu hỏi

1
Câu hỏi của bạn liên quan đến SQL nhiều hơn bản thân TypeORM, nhưng giả sử rằng bạn đang sử dụng một phép tính vòng tròn lớn cơ bản, hãy xem ý chính đó gist.github.com/rugbyprof/
Roomy

cảm ơn vì liên kết đó Tôi đã cố gắng dịch nó ở đây pastebin.com/AS7y7efr và không có lỗi. Nhưng tôi phải kiểm tra xem tính toán đó có đúng không ...
Câu hỏi

1
Bạn đã xem phần mở rộng PostGIS cho PostgreSQL chưa? Nó chứa chức năng để xác định khoảng cách giữa các tọa độ (điểm). Xem gis.stackexchange.com/questions/77072/ cho một số ví dụ về cách đạt được các hàng lọc truy vấn trong một khoảng cách xác định từ tọa độ được cung cấp.
Timshel

Câu trả lời:


0

OK Nếu bạn đã thực hiện những điều sau đây vào mã của mình, bạn cần đánh giá hàm trước khi chuyển nó sang chuỗi SQL. Rất dễ:

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

xin lỗi, tôi không hiểu câu trả lời của bạn Đây là một dự án NestJs (Node with TS) sử dụng TypeORM. Tôi nên làm gì trong mã của tôi?
Câu hỏi

@ Câu hỏi
3r

xin lỗi nhưng điều này sẽ không hoạt động vì hàm không biết về các giá trị latlong hiện tại đến từ bảng cơ sở dữ liệu ở đâylocation.latitude, location.longitude
Câu hỏi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.