基于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
相关产品推荐
相关产品推荐

