mysql - SilverStripe ORM 中每个 mysql 位置 Y 周围半径 X 内的位置

标签 mysql orm geolocation silverstripe

我在 SilverStripe 3.4.0 中根据 mysql 过滤位置 Y 半径 X 内的位置。

到目前为止,我已经实现了一个原始查询来获取圈子中的 ID,而不是使用这些来过滤每个 SilverStripe ORM,因为我必须根据多个条件进行过滤,而地理过滤器只是其中之一。

另请参阅 Google 的“Store Locator”示例: https://developers.google.com/maps/articles/phpsqlsearch_v3

$searchDistance = '...';
$searchLat = '...';
$searchLng = '...';

$geolimitedIDs = DB::query('SELECT id, (6371 * acos(cos(radians('.$searchLat.')) * cos(radians(Latitude)) * cos( radians(Longitude) - radians('.$searchLng.')) + sin(radians('.$searchLat.')) * sin(radians(Latitude))))
    AS distance
    FROM "DataObject"
    HAVING distance < ' . $searchDistance . '
    ORDER BY distance')->column();

if($geolimitedIDs) {
    $DataObjects = $DataObjects->filter(array(
        'ID' => $geolimitedIDs
    ));
}

在 _config 中我制作了 DataObject-Tabel MyISAM

DataObject:
  create_table_options:
    MySQLDatabase:
      'ENGINE=MyISAM'

这提供了所需的结果,但需要额外的查询。 是否可以将地理过滤器直接添加到 ORM 中的查询?

最佳答案

是的,可以使用 ORM 来实现这一点。您可以将 DataQueryDataList 中拉出来,更改它(添加子句等),然后用它更新 DataList

类似于:

$dataList = MyObject::get();

$dataQuery = $dataList->dataQuery();

$dataQuery->where(...);
$dataQuery->having(...);

$dataList->setDataQuery($dataQuery);

添加和别名选择有点棘手,因为您随后需要根据 DataQuery 修改 SQLQuery,但它应该也是可能的,尽管只需添加haversin 公式作为排序将起作用。

$dataList->sort(...)

关于mysql - SilverStripe ORM 中每个 mysql 位置 Y 周围半径 X 内的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38952387/

相关文章:

node.js - Sequelize 如何提出加入请求?

javascript - 变量被绑定(bind)到 getCurrentLocation 函数的回调。为什么这个关闭不起作用?

php - canvas toDataUrl() 如何将base64结果传入和传出mysql blob字段

php - 代码点火器 : How to move value from table in database?

mysql - SQL 查询 - 从以逗号分隔的一列中获取数据

python - 你如何在 Peewee 模型中存储列表?

sql - 我可以 100% 依靠逻辑处理来知道哪些对象(列别名、表等)在后续查询子句中有 "available"吗?

java - JPA/EclipseLink - 检索列名称

php - 允许用户找到半径内的其他用户

android - 用于定位的手机加速度计在现实世界中的准确度是多少?