数据库
首页 > 数据库> > SilverStripe ORM中每个mysql的半径X围绕位置Y的位置

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