如何在 Drupal 8 中扩展给定查询以按英里搜索?

How to extend given query for search by miles in Drupal 8?

我已经给出了节点查询并希望按英里扩展搜索,

$query = \Drupal::entityQuery('node')
        ->condition('status', 1)
        ->condition('type', 'event')
        ->range(0, 10);

使用以下查询(已安装的地理定位模块)以数组格式出现的位置,并希望使用不使用内部搜索功能的自定义查询进行记录

$locationInArray = $node->get('location')->getValue();

数组值如下:

lat(纬度), lng(经度), lat_sin(预先计算的纬度正弦), lat_cos(预先计算的纬度余弦), lng_rad(预先计算的弧度经度)。

我面临来自另一个 table 的经纬度问题,所以如何扩展上述查询

我需要像 2 这样的距离搜索 km/miles 没有 drupal 模块的帮助 因为我已经实现了但没有满足我的所有需求所以想制作自定义搜索模块。

这里给出了距离查询,但我是 drupal 的新手,所以请帮助我将给定的查询集成到我的代码中。

SELECT ID, ( 第3959章 余弦(弧度(78.3232)) * cos(弧度(纬度)) * cos(弧度(lng)-弧度(65.3234)) +罪恶(弧度(78.3232)) *罪(弧度(纬度)) ) ) 距离 FROM 标记 距离 < 30 按距离排序 限制 0 , 20;

你可以试试:

$query = \Drupal::entityQuery('node')
    ->condition('status', 1)
    ->condition('type', 'event')
    ->condition('location.lat', $your_value_lat)
    ->condition('location.lng', $your_value_lng)
    ->condition('location.lat_sin', $your_value_lat_sin)
    ->condition('location.lat_cos', $your_value_lat_cos)
    ->condition('location.lng_rad', $your_value_lng_rad)
    ->range(0, 10);

修改问题后编辑:

要在 drupal 中使用查询 directyl,请使用 $query = \Drupal::database()->query()

更多:https://www.drupal.org/docs/8/api/database-api

您的示例应该看起来像这样(我只是将一个值与变量交换以显示如何完成):

$query = \Drupal::database()
  ->query("SELECT id, ( :example_variable * acos ( cos ( radians(78.3232) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(65.3234) ) + sin ( radians(78.3232) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 30 ORDER BY distance LIMIT 0 , 20;",
[
  ':example_variable' => '3959'
]);
$result = $query->fetchAll();