如何在Laravel Eloquent中执行此存储过程和子查询SQL?

时间:2018-10-22 13:40:31

标签: php mysql laravel eloquent

我试图在下面执行此SQL语句,但发现Laravel Eloquent语法对于使用存储过程和子查询进行更复杂的查询相当混乱。

我将如何执行以下内容?

$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;

1 个答案:

答案 0 :(得分:2)

首先,让我们编写 WHERE IN 子查询

$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")可被表的表述模型替换。