Consulta CakePHP longitude de latitude mais próxima do banco de dados
Em um aplicativo CakePHP (v3), como posso recuperar os resultados mais próximos com base nos valores de latência passados?
Eu gostaria de tê-los de volta como entidades nativas do CakePHP, algo assim:
public function closest($lat, $lng) {
$sightings = //records within given lat lng
$this->set(compact('sightings'));
$this->set('_serialize', ['sightings']);
}
Eu sei que este SQL funciona:
SELECT *,
( 3959 * acos( cos( radians(50.7) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-1.8) ) + sin( radians(50.7) ) * sin( radians( latitude ) ) ) ) AS distance
FROM sightings
HAVING distance < 10
ORDER BY distance
LIMIT 0 , 20
Lutando para combinar os dois.
ATUALIZAR
eu já adicionei
class Sighting extends Entity {
public $_virtual = ['distance'];
//rest of class...
}
Então agora odistance
está aparecendo na minha saída do json (com o valor nulo, como seria de esperar agora, mas acho que é um passo na concessão).
Eu dei uma olhada aqui:http://www.mrthun.com/2014/11/26/search-distance-cakephp/ que parece ser o que estou tentando alcançar, assumindo algo assim:
$latitude = 51.145;
$longitude = -1.45;
$distance = 100;
$this->Sightings->virtualFields
= array('Sightings.distance'
=> '(3959 * acos (cos ( radians('.$latitude.') )
* cos( radians( Sightings.latitude ) )
* cos( radians( Sightings.longitude )
- radians('.$longitude.') )
+ sin ( radians('.$latitude.') )
* sin( radians( Sightings.latitude ) )))');
$sightings = $this->Sightings->find('all', [
'conditions' => ['Sightings.distance <' => $distance]
]);
$this->set(compact('sightings'));
$this->set('_serialize', ['sightings']);
Resulta em:Column not found: 1054 Unknown column 'Sightings.distance' in 'where clause'
Não tem certeza se é possível CakePHP v2 em vez de v3?