CakePHP den nächstgelegenen Breitengrad und Längengrad von der Datenbank abfragen

Wie kann ich in einer CakePHP (v3) -Anwendung anhand der übergebenen Langzeitwerte die bestmöglichen Ergebnisse abrufen?

Ich würde sie gerne wieder als native CakePHP-Entities haben, also ungefähr so:

public function closest($lat, $lng) {

    $sightings = //records within given lat lng 

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

Ich weiß, dass diese SQL funktioniert:

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

Schleichen, um beides zu verbinden.

AKTUALISIERE

Ich habe hinzugefüg

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

So jetzt dasdistance wird in meiner json-Ausgabe angezeigt (mit dem Wert null, wie es derzeit zu erwarten ist, aber ich denke, es ist ein kleiner Schritt).

Ich habe hier nachgesehen:http: //www.mrthun.com/2014/11/26/search-distance-cakephp das scheint das zu sein, was ich zu erreichen versuche, vorausgesetzt so etwas:

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

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

Nicht sicher, ob es möglich ist, CakePHP v2 im Gegensatz zu v3?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage