代码之家  ›  专栏  ›  技术社区  ›  Mr J

我将如何在laravel-elount中执行这个存储过程和子查询SQL?

  •  0
  • Mr J  · 技术社区  · 6 年前

    我正在尝试执行下面的这个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;
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Oluwafemi Sule    6 年前

    首先,让我们写 在哪里 子查询

    $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") 可由表的雄辩模型替换。