Laravel имеющий: столбец не найден

Мой следующий код выглядит так:

$places = DivePlace::selectRaw("*,(st_distance_sphere( POINT(".$lon.",".$lat.") ,  point(lon, lat))/1000) as distance")
    ->havingRaw("distance < ".$radius)
    ->orderBy("distance")
    ->paginate(10);

без "hasRaw" все хорошо. После добавления возникла следующая ошибка:

SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец "расстояние" в "имеющем предложении" (SQL: выберите количество (*) в качестве агрегата из dive_places имея расстояние < 300)

Любое решение?

2 ответа

Решение
->where(DB::raw("(ST_Distance_Sphere(POINT(".$lon.",".$lat."), POINT(lon,lat))/1000)"), '<', 200)

вместо ->havingRaw("(st_distance_sphere( POINT(?, ?) , point(lon, lat))/1000) < ?", [$lon, $lat, $radius])

Вам нужно повторить определение расстояния, потому что для пагинации Laravel использует только count(*) для столбцов так и должно быть:

$places = DivePlace::selectRaw("*,(st_distance_sphere( POINT(".$lon.",".$lat.") ,  point(lon, lat))/1000) as distance")
    ->havingRaw("(st_distance_sphere( POINT(".$lon.",".$lat.") ,  point(lon, lat))/1000) < ".$radius)
    ->orderBy("distance")
    ->paginate(10);

Вы также можете использовать привязки для запроса, поэтому лучше будет:

$places = DivePlace::selectRaw("*,(st_distance_sphere( POINT(?, ?) ,  point(lon, lat))/1000) as distance",[$lon, $lat])
    ->havingRaw("(st_distance_sphere( POINT(?, ?) ,  point(lon, lat))/1000) < ?", [$lon, $lat, $radius])
    ->orderBy("distance")
    ->paginate(10);
Другие вопросы по тегам