Поэтому я пытаюсь найти ближайшие точки к другой конкретной точке на определенном расстоянии, и я использую для этого формулу haversine. Сам необработанный запрос:
SELECT id,
( 3959 * acos( cos( radians(input_lat) ) * cos( radians( map_loc_lat ) ) * cos( radians( map_loc_long ) - radians(input_long) ) + sin( radians(input_lat) ) * sin( radians( map_loc_lat ) ) ) )
AS distance FROM posts HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;
куда input_lat
а также input_long
мои предопределенные координаты, с которых я хочу начать свою точку поиска центра, и map_loc_lat
а также map_loc_long
являются posts
‘ точки.
Я пытаюсь использовать Eloquent’s selectRaw()
способ сделать часть тяжелой работы, например, так:
$query->selectRaw('id, ( 6371 * acos( cos( radians(?) ) * cos( radians( map_loc_lat ) )
* cos( radians( ? ) - radians(?) ) + sin( radians(?) )
* sin( radians( map_loc_lat ) ) ) ) AS distance', )
Но я запутался в том, как мне следует указывать вопросительные знаки, чтобы указать мою входную широту и долготу, используя Eloquent, а также как мне продолжить цепочку для моего заказа по предложению и моим ограничениям?
Использовал тот же sql в одном из моих проектов. Не нашел другого решения вместо использования DB::raw()
а также select()
Вот пример:
$distance = Input::get('distance', 0.1);
$lat = Input::get('latitude');
$lng = Input::get('longitude');
$select="drops.*,(6371 * acos( cos( radians({$lat}) ) * cos( radians( drops.latitude ) ) * cos( radians( drops.longitude ) - radians({$lng}) ) + sin( radians({$lat}) ) * sin( radians(drops.latitude) ) )) AS distance";
$drops_query = DB::table('drops')->select(DB::raw($select))
->addSelect('users.login as username')
->leftJoin('users', 'users.id', '=', 'drops.user_in')
->where('drops.latitude','<>','')
->where('drops.longitude','<>','');
$drops_query = $drops_query->having('distance', '<=', $distance)->orderBy('distance','DESC');
$drops = $drops_query->take($limit)->get();
Этот подход позволяет мне добавить к этому сложному запросу некоторую дополнительную фильтрацию, нумерацию страниц и т. Д.
Других решений пока нет …