Vì vậy, bạn không cần tất cả những gì có trong ý chính đó, thay vào đó, bạn có thể sử dụng các công thức sau:
public function get_offers_near($latitude, $longitude, $radius = 1){
$offers = Offer::select('offers.*')
->selectRaw('( 3959 * acos( cos( radians(?) ) *
cos( radians( offer_lat ) )
* cos( radians( offer_long ) - radians(?)
) + sin( radians(?) ) *
sin( radians( offer_lat ) ) )
) AS distance', [$latitude, $longitude, $latitude])
->havingRaw("distance < ?", [$radius])
->get();
return $offers;
}
Điều này giả định rằng bạn vượt qua latitude
và longitude
từ người dùng của bạn. Ngoài ra, nếu bạn không muốn bán kính là 1, bạn có thể chuyển vào đối số thứ 3 và cung cấp bán kính tùy chỉnh.
Và tất nhiên, chúng tôi giả định rằng điều này dành cho mô hình Offer
. Thay đổi quy ước đặt tên của bạn nếu cần.