SilverStripe ORM中每个mysql的半径X围绕位置Y的位置
作者:互联网
我在SilverStripe 3.4.0中按照mysql过滤半径X围绕位置Y的位置X内的位置.
到目前为止,我已经实现了原始查询以获取圈子中的ID,然后使用它们对每个SilverStripe ORM进行过滤,因为我必须针对多个条件进行过滤,而geofilter只是其中之一.
另请参阅Google的“商店定位器”示例:
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(...)
标签:silverstripe,orm,geolocation,mysql 来源: https://codeday.me/bug/20191026/1939102.html