Laravel / Eloquent - не может выполнить необработанный запрос - PullRequest
0 голосов
/ 26 ноября 2018

Это функция, которая выполняет запрос:

    public static function getNearbyCityReport(float $lon, float $lat, float $rangeInKm){
    $query = "
        SELECT
            name,
            population,
            round((ST_Distance(rpoint, 'POINT( ? ? )', True)/1000)::numeric, 1) as distance,
            round(degrees(ST_Azimuth(rpoint, 'POINT( ? ? )'))::numeric,1) AS azimuth
        FROM
            gis_cities
        WHERE
            ST_DWithin(rpoint, 'POINT( ? ? )', 1000*?, True)
            AND
            feature_code != 'PPLX'
        ORDER BY distance;        
    ";
    $query = preg_replace('#\n#', ' ', $query);
    $query = trim(preg_replace('#\s{2,}#', ' ', $query));
    $expression = DB::raw($query);
    $result = DB::select($expression, [$lon, $lat, $lon, $lat, $lon, $lat, $rangeInKm]);
    dd($result);

При запуске этой функции я получаю следующее исключение:

SQLSTATE [HY093]: Неверный номер параметра:параметр не был определен (SQL: SELECT имя, население, круг ((ST_Distance (rpoint, 'POINT (24.8 43.3648)', True) / 1000) :: числовой, 1) как расстояние, круг (градусы (ST_Azimuth (rpoint, ')POINT (24,8 43,3648) ')) :: числовой, 1) AS азимут ОТ gis_cities WHERE ST_DWithin (rpoint,' POINT (24,8 43,3648) ', 1000 * 300, True) И feature_code! =' PPLX 'ORDER BY distance;)

Странно то, что в построенном запросе, показанном в исключении, кажется, ничего не пропущено, и если я выполню этот запрос в своей базе данных, он будет работать правильно .Как я могу сделать эту работу?

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ:

Очевидно, что проблема на самом деле лежит на уровне PDO и вызвана тем, что я пытаюсь добавить некоторые параметрывнутри строки в кавычках:

(ST_Distance(rpoint, 'POINT( ? ? )', True)/1000)

См. 'POINT (??)' частей.Если я удаляю все кавычки из моего запроса, тогда он работает, но, конечно, он больше не является действительным постгис-запросом.Кто-нибудь знает, как должен быть написан этот запрос, чтобы PDO его принял?

1 Ответ

0 голосов
/ 26 ноября 2018

Вы должны объединить две координаты в одну привязку:

(ST_Distance(rpoint, 'POINT( ? )', True)/1000)

$result = DB::select($expression, [$lon.' '.$lat, ...]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...