添加查询结果的距离

时间:2017-02-14 22:23:44

标签: mysql sql laravel laravel-5 eloquent

我尝试显示搜索结果的距离

代码和查询

$query = DB::select(DB::raw('SELECT id, ( 3959 * acos( cos( radians(' . $lat . ') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(' . $lng . ') ) + sin( radians(' . $lat .') ) * sin( radians(latitude) ) ) ) AS distance FROM listings HAVING distance < ' . $distance . ' ORDER BY distance') );
        foreach($query as $q)
        {
            array_push($ids, $q->id);

        }
        $placeholders = implode(',',array_fill(0, count($ids), '?'));
        $listings = Listing::whereIn('id', $ids)->orderByRaw("field(id,{$placeholders})", $ids)->paginate(10);

$ query包含距离。

如何为列表结果添加距离?

2 个答案:

答案 0 :(得分:0)

将距离选择查询也附加到雄辩查询。

使用以下方法;

Listing::select([
   "*",
   "( 3959 * acos( cos( radians(' . $lat . ') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(' . $lng . ') ) + sin( radians(' . $lat .') ) * sin( radians(latitude) ) ) ) AS distance"
])......

另外,为什么不使用第一个查询的结果,不需要执行两次相同的查询。

答案 1 :(得分:0)

如果您想获得任何特定距离的结果:

$radius = 15;
Listing::select(
        DB::raw("*, (6371 * acos(cos(radians('".$lat."')) * cos(radians(latitude)) * cos( radians(longitude) - radians('".$lon."')) + sin(radians('".$lat."')) * sin(radians(latitude)))) AS **distance**"
            )
        )
        ->having("distance", "<", $radius)
        ->orderBy("distance")
        ->get();