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?

questionAnswers(5)

yourAnswerToTheQuestion