我们正在使用Postgres数据库运行CakePHPv3.x。我需要选择一些经度和纬度在距另一点X距离之内的记录。 PostGIS has a function that does just this,但似乎必须正确处理原始SQL查询才能使用它。

我并不是在寻求帮助来编写原始查询,但我正在寻找有关原始查询方法是否是在充分利用框架的同时使用此扩展的正确方法的确认。我进行了搜索,但没有找到任何库来扩展CakePHP ORM来包括此库。也许还有我没有想到的第三种选择。

[注意:这不起作用...]

public function fetch()
{
    $maxMetersAway = 10 * 1000;
    $lat = $this->request->query['lat'];
    $lng = $this->request->query['lng'];

    $stops = $this->Stops->find('all')
        ->where("ST_DWithin( POINT($lng,$lat), POINT(Stops.lng,Stops.lat), $maxMetersAway")
        ->toArray();

    $this->set(['stops'=>$stops, '_serialize' => true]);
}

最佳答案

我得到了与此相关的CakePHP查询:

$stops = $this->Stops->find('all')
        ->where(['ST_DWithin( ST_SetSRID(ST_MakePoint(' . $longitude . ', ' . $latitude . '),4326)::geography, ST_SetSRID(ST_MakePoint(Stops.longitude, Stops.latitude),4326)::geography, ' . $maxMetersAway . ')'])
        ->toArray();

更新了:原始版本实际上无法正确使用$maxMetersAway

10-02 03:26