如何在laravel eloquent中执行此存储过程和子查询sql?

s5a0g9ez  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(451)

我试图执行下面的sql语句,但是我发现laravel雄辩的语法对于带有存储过程和子查询的更复杂查询来说相当混乱。
我将如何执行以下命令?

$longitude  = (float) $longLat['longitude'];
$latitude   = (float) $longLat['latitude'];
$radius     = $distance; // in miles

$lng_min = $longitude - $radius / abs(cos(deg2rad($latitude)) * 69);
$lng_max = $longitude + $radius / abs(cos(deg2rad($latitude)) * 69);
$lat_min = $latitude - ($radius / 69);
$lat_max = $latitude + ($radius / 69);

SELECT get_distance_in_miles_between_geo_locations(51.666774,-1.92973, lat, lng) AS distance_from_input, domain FROM websites_lats_and_longs WHERE domain IN (SELECT domain FROM websites_lats_and_longs
WHERE (lng BETWEEN $lng_min AND $lng_max)
AND (lat BETWEEN $lat_min and $lat_max)) ORDER BY distance_from_input;
h6my8fg2

h6my8fg21#

首先,让我们编写子查询中的where

$range = DB::table("websites_lats_and_longs")
           ->select("domain")
           ->whereBetween("lng", [$lng_min, $lng_max])
           ->whereBetween("lat", [$lat_min, $lat_max])
           ->get();

接下来,编写使用存储函数的查询

$result = DB::table("websites_lats_and_longs")
            ->selectRaw(
              "get_distance_in_miles_between_geo_locations(?, ?, lat, lng)"
            , [51.666774, -1.92973])
            ->whereIn(["domain" => $range])
            ->orderBy("distance_from_input")
            ->get();

哪里 DB::table("websites_lats_and_longs") 被雄辩的table模型所取代。

相关问题