Consulta de CakePHP latitud más cercana longitud de la base de datos

En una aplicación CakePHP (v3), ¿cómo puedo recuperar los resultados más cercanos en función de los valores de lat lng pasados?

Me gustaría recuperarlos como entidades nativas de CakePHP, así que algo como esto:

public function closest($lat, $lng) {

    $sightings = //records within given lat lng 

    $this->set(compact('sightings'));
    $this->set('_serialize', ['sightings']);
}

Sé 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

Luchando para combinar los dos.

ACTUALIZAR

he añadido

class Sighting extends Entity {
    public $_virtual = ['distance'];
    //rest of class...
}

Entonces ahora eldistance se muestra en mi salida json (con el valor de nulo como se esperaría en este momento, pero siento que es un paso en arrendamiento).

He echado un vistazo aquí:http://www.mrthun.com/2014/11/26/search-distance-cakephp/ que parece ser lo que estoy tratando de lograr, así que asumí algo como esto:

$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']);

Resultados en:Column not found: 1054 Unknown column 'Sightings.distance' in 'where clause'

¿No está seguro de si es posible CakePHP v2 en lugar de v3?

Respuestas a la pregunta(5)

Su respuesta a la pregunta