GEO位置查询PHP和SQL与Laravel

时间:2016-11-04 17:53:31

标签: php mysql sql laravel laravel-5

我目前正在制作Laravel 5.2中的广告系列/广告脚本。我有一张广告表,例如:广告名称,位置(纬度/经度),半径(+ 10公里)。

现在我有一个用户位置(纬度/经度)。我想知道他是否在任何广告的半径范围内并向他展示广告。

我有这个:

public function scopeAdsInLocation($query, $from_latitude, $from_longitude)
{
    $query = CampaignModel::
    where(\DB::raw('111.1111 * DEGREES(ACOS(COS(RADIANS(' . $from_latitude . ')) * COS(RADIANS(campaigns.loc_lat)) * COS(RADIANS(' . $from_longitude .' -
        campaigns.loc_long)) + SIN(RADIANS(' . $from_latitude . ')) * SIN(RADIANS(campaigns.loc_lat))))'), '<=', 'campaigns.loc_radius')
        ->get();
    return $query;
}

我称之为:

$ads = CampaignModel::adsInLocation(51.191320, 5.987772);
var_dump($ads);

此代码有效,但仅限于我将半径设置为固定值。因此,当我将campaigns.loc_radius替换为'100'时,它可以正常工作。但是,每个广告系列都有半径,但它似乎没有做到这一点。你知道为什么吗?或者有一个解决方案。

1 个答案:

答案 0 :(得分:0)

where()中,您可以使用

\DB::raw("`campaigns`.`loc_radius`")

所以你的查询将是:

public function scopeAdsInLocation($query, $from_latitude, $from_longitude)
{
    $query = CampaignModel::
    where(\DB::raw('111.1111 * DEGREES(ACOS(COS(RADIANS(' . $from_latitude . ')) * COS(RADIANS(campaigns.loc_lat)) * COS(RADIANS(' . $from_longitude .' -
        campaigns.loc_long)) + SIN(RADIANS(' . $from_latitude . ')) * SIN(RADIANS(campaigns.loc_lat))))'), '<=', \DB::raw("`campaigns`.`loc_radius`"))
        ->get();
    return $query;
}