我在 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 来实现这一点。您可以将 DataQuery
从 DataList
中拉出来,更改它(添加子句等),然后用它更新 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/