如何在laravel长途跋涉附近的法院?

时间:2017-05-16 10:22:53

标签: php laravel laravel-5

我希望在雄辩的ORM基础上获得篮球场。我试图得到它,但在这里我得到了这个错误。

Call to undefined function App\Http\Controllers\Api\RADIANS()

有没有办法使用Eloquent到达附近位置,如果是,那么如何?请帮助我,到目前为止,我正在分享我的行为。

HomeCourt Controller

public function fetchHomeCourts(Request $request) {

    $validator = Validator::make(
        array(
            'lat' => $request->lat,
            'long' => $request->long,
        ),
        array(
            'lat' => 'required',
            'long' => 'required',
        )
    );
    if ($validator->fails()) {
        $this->setMeta("422", Constant::MSG_422);
        return response()->json($this->setResponse());
    }
    $homeCourt= HomeCourt::where(ACOS(SIN(RADIANS('latitude'))*SIN(RADIANS($request->lat))+COS(RADIANS('latitude'))*COS(RADIANS($request->lat))*COS(RADIANS('longitude')-RADIANS($request->long)))*6380 < 10)->first();
    if(!$homeCourt) {
        $this->setMeta("200", "No courts found");
        $this->setData("homeCourts",$homeCourt);
        return response()->json($this->setResponse());
    }
    $this->setMeta("200", "Home court list");
    $this->setData("homeCourts",$homeCourt);
    return response()->json($this->setResponse());

}

3 个答案:

答案 0 :(得分:1)

这只能使用Google Map Places Web Service API来完成,这可以帮助您获得您正在寻找的功能。

通过“附近搜索”,您可以搜索指定区域内的位置。您可以通过提供关键字或指定要搜索的地点类型来优化搜索请求。

附近搜索请求是以下格式的HTTP网址:

https://maps.googleapis.com/maps/api/place/nearbysearch/output?parameters

其中输出可以是以下值之一:

json (recommended) indicates output in JavaScript Object Notation (JSON)

xml indicates output as XML

附近的搜索示例

以下示例是对&#39; restaurant&#39;类型的地点的搜索请求。在澳大利亚悉尼一个500米半径范围内,包含“巡航”字样

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&radius=500&type=restaurant&keyword=cruise&key=YOUR_API_KEY

Reference

答案 1 :(得分:1)

所以这就是基本发生的事情:

用户将为您提供他们感兴趣的坐标(通过神奇的程序,大多数页面提供用户点击的地图,但它确实最适合您的用户)。

这是您的代码需要阅读的内容:

public function fetchHomeCourts(Request $request) {

    $validator = Validator::make(
        array(
            'lat' => $request->lat,
            'long' => $request->long,
        ),
        array(
            'lat' => 'required',
            'long' => 'required',
        )
    );
    if ($validator->fails()) {
        $this->setMeta("422", Constant::MSG_422);
        return response()->json($this->setResponse());
    }
    $homeCourt= HomeCourt::whereRaw("ACOS(SIN(RADIANS('latitude'))*SIN(RADIANS($request->lat))+COS(RADIANS('latitude'))*COS(RADIANS($request->lat))*COS(RADIANS('longitude')-RADIANS($request->long)))*6380 < 10")->first();
    if(!$homeCourt) {
        $this->setMeta("200", "No courts found");
        $this->setData("homeCourts",$homeCourt);
        return response()->json($this->setResponse());
    }
    $this->setMeta("200", "Home court list");
    $this->setData("homeCourts",$homeCourt);
    return response()->json($this->setResponse());

}

whereRaw位将直接将整个公式传递给MySQL,而不是让Laravel试图弄清楚如何将其构建到查询中(因为它不是Laravel可以处理的标准格式。 / p>

根据我的理解,公式基本上是地球曲面上的距离(6380是以千米为单位的地球半径,其余部分看起来像是两点的弧距)。

假设您感兴趣的所有法院都存储在您的数据库中(您可以使用手动列表或使用某种过夜流程更新它们以便从某个地方获取)您不需要运行API查询每个请求。

答案 2 :(得分:0)

我尝试了上面的答案没有成功,但是感谢@apokryfos回答,我做到了,所以这是我的代码,我把它放在了原始数据库查询中。

\DB::table("users")
     ->select("users.id", \DB::raw("6371 * acos(cos(radians(" . $this->lat . "))
     * cos(radians(users.latitude)) 
     * cos(radians(users.longitude) - radians(" . $this->lng . ")) 
     + sin(radians(" .$this->lat. ")) 
     * sin(radians(users.latitude))) AS distance"))
     ->having('distance', '<', $this->rad)
     ->first();