केक 3 में और कोई वर्चुअल फ़ील्ड नहीं हैं लेकिन आप अभी भी अपने परिकलित फ़ील्ड के लिए एक उपनाम बना सकते हैं
जैसा कि @ndm द्वारा सुझाया गया है, आप $latitude
. को बेहतर ढंग से बाँध सकते हैं और $longitude
SQL इंजेक्शन को रोकने के लिए
$distanceField = '(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()
->select([
'distance' => $distanceField
])
->where(["$distanceField < " => $distance])
->bind(':latitude', $latitude, 'float')
->bind(':longitude', $longitude, 'float')
->contain(['Photos', 'Tags']);
होने का उपयोग करना
$sightings = $this->Sightings->find()
->select([
'distance' => $distanceField
])
->having(['distance < ' => $distance])
->bind(':latitude', $latitude, 'float')
->bind(':longitude', $longitude, 'float')
->contain(['Photos', 'Tags']);