You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于LaravelMysqlSpatial实现按关联国家距离排序的地点查询

实现方案

第一步:获取用户所属国家的坐标点

首先查询出波兰的空间坐标数据,这里假设你的countries表用iso_code字段存储国家二字码,空间经纬度字段为coordinate(point类型,可根据你的实际字段名修改)

// 获取波兰的坐标点
$poland = Country::where('iso_code', 'PL')->firstOrFail();
$polandPoint = $poland->coordinate;

第二步:修改查询逻辑,连表计算距离排序

因为要用到关联Country表的坐标做排序,不能用预加载with,需要用join连表查询,直接在SQL层面完成距离计算和排序,调用Grimzy扩展包提供的orderByDistance方法即可:

$places = Place::active()
    // 关联国家表,避免字段名冲突
    ->join('countries', 'places.country_id', '=', 'countries.id')
    ->select('places.*') // 仅查询places表字段,避免覆盖主表id等重名字段
    ->where(function ($query) use ($request) {
        $query->where('places.name', 'like', $request->q . '%')
            ->orWhere('places.ascii_name', 'like', $request->q . '%');
    })
    // 按国家和波兰的距离升序排序
    ->orderByDistance('countries.coordinate', $polandPoint)
    ->limit(10)
    ->get();

注意事项

  • 如果需要限定只查询指定国家的城市,可在查询条件中追加->whereIn('countries.iso_code', ['PL', 'US', 'ES'])这类条件即可
  • 代码中的countries.coordinate要替换为你国家表实际的point类型经纬度字段名
  • 如果出现字段冲突,所有条件里的字段都加上表名前缀即可

内容的提问来源于stack exchange,提问作者Jacktur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:21:00