mysql - 通过其他连接在 laravel 5 中获取经纬度

标签 mysql laravel laravel-5 latitude-longitude

这对我来说是一个相当复杂的问题。我有一条搜索路线 - 效果很好,除了我无法通过邮政编码搜索以找到最接近给定邮政编码的纬度和经度。也就是说,我可以算出纬度和经度,但我不确定如何将它集成到我现有的查询中。此查询是不带邮政编码的搜索查询:

$query = DB::table('dogs');
$query->leftJoin('dog_addresses','dogs.id','=','dog_addresses.dog_id');
$query->leftJoin('dog_videos','dogs.id','=','dogs_videos.dog_id');
$query->leftJoin('dogs_breeds','dogs.breed_id','=','dogs_breeds.id');
if($request->input("breed") && $request->input("breed") != "" && $request->input("breed") != "any")
    {
        $breed = Dog_Breed::where("breed_name", $request->input("breed"))->first();
        $query->where('dogs.breed_id', $breed->id);
    }
$results = $query->get();

我有一些东西要添加到查询中以获取邮政编码的纬度和经度:

if($request->input("postcode")) 
{
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_URL, "http://api.postcodes.io/postcodes/" . $request->input('postcode'));
    $result = json_decode(curl_exec($curl));
    curl_close($curl);
    $postcode_lat = $result->result->latitude;
    $postcode_long = $result->result->longitude;            
}

这让我可以得到我的邮政编码纬度和经度。 但是我不知道如何根据连接到 dogs 表的 dog_addresses 表中存在的纬度和经度列按位置获取狗。我该怎么做?

所以如果我的 dog_addresses 表有 Lat 和 Long 列。

所以狗:

id | user_id | dog_name | age

dog_addresses:

id | dog_id | address_line_1 | town | postcode | lat | long

所以对于我的查询,我需要获取所有狗,其中繁殖 ID 为 1,但我想内部加入视频以便我可以获得所有视频信息和地址信息,但我还想对返回的狗的顺序进行排序根据纬度和经度,它们与我输入的邮政编码有多接近。

我很困惑。我发现了这个:

( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance

但我仍然不确定如何集成它,或者它对我有什么用。 请帮忙

最佳答案

下面的代码将能够以您想要的方式检索结果。内联代码解释。

if($request->input("postcode")) 
{
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_URL, "http://api.postcodes.io/postcodes/" . $request->input('postcode'));
    $result = json_decode(curl_exec($curl));
    curl_close($curl);
    $postcode_lat = $result->result->latitude;
    $postcode_long = $result->result->longitude;   

    $query = DB::table('dogs');
    //Join statement responsible for retrieving dogs addresses based on latitude and longitude in address table.
    $query->join(DB::raw('(SELECT  dog_id, (
                              3959 * acos (
                              cos ( radians($postcode_lat) )
                              * cos( radians( lat ) )
                              * cos( radians( long ) - radians($postcode_long) )
                              + sin ( radians($postcode_lat) )
                              * sin( radians( lat ) )
                            )       
                    )AS distance from dog_addresses) as dog_addresses'), function ($join){
            $join->on('dogs.id', '=', 'dog_addresses.dog_id')

        }); 
    $query->leftJoin('dog_videos','dogs.id','=','dogs_videos.dog_id');
    $query->leftJoin('dogs_breeds','dogs.breed_id','=','dogs_breeds.id');
    if($request->input("breed") && $request->input("breed") != "" && $request->input("breed") != "any")
    {
        $breed = Dog_Breed::where("breed_name", $request->input("breed"))->first();
        $query->where('dogs.breed_id', $breed->id);
    }
    $results = $query->orderBy('dog_addresses.distance', 'ASC') //Ordering the results in ascending order by calculated distance 
                    ->limit(20) //Limiting the results to 20 . Can be changed or removed according to your needs
                    ->get(); //Retrieving the results
}

关于mysql - 通过其他连接在 laravel 5 中获取经纬度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38676500/

相关文章:

mysql - JOOQ MySQL TEXT 数据类型

mysql - IF 在 MySql 中构建产生错误 #1064

mysql - 在 MySQL 中,更改主键的模式是否会影响其他表中外键的模式?

javascript - Laravel 5 Javascript 启用/禁用检测

laravel - Composer 全局要求 laravel/安装程序卡在 "Changed current directory"

php - Laravel 一对一关系

laravel - 两个项目可以使用同一个数据库吗?

MySQL 更新所有行以将时间添加到时间戳给出 : "Column ' start' cannot be null"

laravel - 如何在 Laravel 5.5 中为选定的 Request 类设置自定义响应

php - Lavel 5.x 与 Redis 队列生成大量日志