Как не использовать БД в следующем запросе, имеющем подзапрос
У меня есть следующая функция для расчета расстояний между двумя точками по формуле Хаверсайна:
public static function getByDistance($distance)
{
$pubsFiltered = DB::select(
'SELECT * FROM
(SELECT *, (6371 * acos(cos(radians(40.4169473)) * cos(radians(latitude)) *
cos(radians(longitude) - radians(-3.7035285)) +
sin(radians(40.4169473)) * sin(radians(latitude))))
AS distance
FROM pubs) AS distances
WHERE distance < ' . $distance . '
ORDER BY distance
;
');
return $pubsFiltered;
}
Это возвращает массив вместо коллекции, это то, что мне нужно.
Если я изменяю DB на Pub, он возвращает ошибку из-за подзапроса, где я вычисляю "расстояние", используя мою таблицу "pubs".
Как я могу изменить целую функцию или просто подзапрос, чтобы получить экземпляр моей модели Pub?... Должен ли я использовать переменные set/ объявление в mysql?
Большое спасибо!!
2 ответа
На данный момент я использую этот запрос для получения близлежащих записей:
public function scopeNearby($query, $lat, $long, $distance = 10)
{
if($lat AND $long) {
// 3959 for miles, 6371 for kilometers
$distanceQuery = '(6371 * acos(cos(radians(?)) * cos(radians(geo_lat)) * ' .
'cos(radians(geo_long) - radians(?)) + sin(radians(?)) ' .
'* sin(radians(geo_lat))))';
return $query->select('*', DB::raw("{$distanceQuery} as distance"))
->addBinding([$lat, $long, $lat], "select")
->whereNotNull('geo_lat')
->whereNotNull('geo_long')
->whereRaw("{$distanceQuery} < ?")
->addBinding([$lat, $long, $lat, $distance], "where")
->orderBy('distance', "ASC");
}
}
Вы можете заметить, что я использовал $distanceQuery
для обоих SELECT
а также WHERE
статьи. В настоящее время у меня возникают проблемы, когда эта область используется вместе с paginate()
метод. Это может потребовать рефакторинга, но сейчас вы можете сделать то же самое.