gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:04:00 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com