【发布时间】:2016-11-22 14:17:50
【问题描述】:
在 CakePHP (v3) 应用程序中,如何根据传递的 lat lng 值检索最接近的结果?
我想让它们作为原生 CakePHP 实体返回,所以像这样:
public function closest($lat, $lng) {
$sightings = //records within given lat lng
$this->set(compact('sightings'));
$this->set('_serialize', ['sightings']);
}
我知道这条 SQL 有效:
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
努力将两者结合起来。
更新
我已经添加了
class Sighting extends Entity {
public $_virtual = ['distance'];
//rest of class...
}
所以现在distance 出现在我的 json 输出中(现在预期的值为 null,但我觉得这是一个步骤)。
我看过这里:http://www.mrthun.com/2014/11/26/search-distance-cakephp/ 这似乎是我想要达到的目标,所以假设是这样的:
$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']);
结果:Column not found: 1054 Unknown column 'Sightings.distance' in 'where clause'
不确定 CakePHP v2 与 v3 相比是否可行?
【问题讨论】:
-
到目前为止,这是我的方法,但我没有做任何距离的事情,我不确定如何将该 sql 插入到 cakes 中。公共函数 findClosest($lat, $lng) { $sightings = $this->Sightings->find('all') ->where(['Sightings.created >' => new Time('-12 hour')] ) -> 限制 (5); $this->set(compact('sightings')); $this->set('_serialize', ['sightings']); }
-
这是蛋糕 2.x 的,无法将其用于 3.x
-
请提供 CakePHP 生成的 SQL。
-
不,这也适用于 3.x,如果您阅读它,您会看到 :) 它将链接到 github.com/dereuromark/cakephp-geo,这是一个 cake 3 插件。众所周知的awesome cakephp list 中也提到了它,在进行任何其他研究之前,它应该始终是您的第一站。
标签: php mysql cakephp location cakephp-3.0