chris48s / cakephp-geodistance
CakePHP 3 模型行为,用于基于距离查询地理编码数据
Requires
- php: >=5.6
- cakephp/cakephp: ^3.4
Requires (Dev)
- cakephp/cakephp-codesniffer: dev-master
- php-coveralls/php-coveralls: ^2.0.0
- phpunit/phpunit: ^5.7
This package is auto-updated.
Last update: 2024-09-14 00:45:30 UTC
README
CakePHP GeoDistance 插件
CakePHP 3 行为,用于通过距离查询地理编码数据。
CakePHP-GeoDistance 是一个 CakePHP 3 行为,它使用球面余弦定律根据地图距离查询地理编码数据。非常适合“找到最近的 X”或“附近找到 Y”类型的查询。如果你的数据库中还没有与地理数据相关联的纬度/经度坐标,你可以使用地理编码插件来添加它们。尝试使用这个插件。
安装
使用 packagist 通过 composer 安装。在您的 composer.json 中添加以下内容
"require": {
"chris48s/cakephp-geodistance": "^2.0.0"
}
然后运行 composer install 或 composer update,具体取决于您的需求。
支持的数据库
仅支持 MySQL 和 Postgres。
使用方法
加载插件
将以下代码添加到您的 bootstrap.php 中:Plugin::load('Chris48s/GeoDistance');。
使用行为
在您的表类中添加行为。
<?php namespace App\Model\Table; use Cake\ORM\Table; class MyTable extends Table { public function initialize(array $config) { parent::initialize($config); $this->addBehavior('Chris48s/GeoDistance.GeoDistance'); } }
配置
默认情况下,行为假设您的表包含名为 latitude 和 longitude 的列,并且您想要以英里为单位执行查询。这些可以更改。只需在附加行为时传递一个选项数组即可。
<?php namespace App\Model\Table; use Cake\ORM\Table; class MyTable extends Table { public function initialize(array $config) { parent::initialize($config); $this->addBehavior('Chris48s/GeoDistance.GeoDistance', [ 'latitudeColumn' => 'lat', 'longitudeColumn' => 'lng', 'units' => 'km' ]); } }
支持的单位是英里或公里。
查询数据
在向表类添加行为后,您现在可以访问 find('bydistance') 查询方法,您可以使用该方法找到给定点的 radius 范围内的数据库记录
<?php use Cake\ORM\TableRegistry; $myTable = TableRegistry::get('MyTable'); $options = [ 'latitude' => 51.3984830139, 'longitude' => -0.236298886484, 'radius' => 10 ]; $query = $myTable ->find('bydistance', $options) ->select(['address', 'lat', 'lng']);
latitude、longitude 和 radius 是必需参数。如果缺少或无效的必需参数,将抛出类 GeoDistanceInvalidArgumentException 的异常。
您还可以向查询传递其他条件或参数,并覆盖默认的“units”
<?php use Cake\ORM\TableRegistry; $myTable = TableRegistry::get('MyTable'); $options = [ 'latitude' => 51.3984830139, 'longitude' => -0.236298886484, 'radius' => 10, 'units' => 'kilometres', 'conditions' => [ 'active' => 1 ] ]; $query = $myTable ->find('bydistance', $options) ->select(['address', 'lat', 'lng']);
find('bydistance') 方法返回一个 CakePHP 查询对象,因此您可以在此对象上链式调用其他方法(例如:->order()、->limit() 等)。