Я хотел бы использовать мой код SQL, основанный на стандартах Laravel. Этот код отлично работает в моем другом проекте. Я хочу добавить это к моей функции контроллера и преобразовать этот код SQL в стандарты Laravel, самым простым способом. Кто-нибудь знает, как это сделать?
Вот мои коды:
SELECT SQL_CALC_FOUND_ROWS a.*, ( $distance_exp * acos( cos( radians($lat) ) * cos( radians( latitude ) )
* cos( radians( lontitude ) - radians($long) )
+ sin( radians($lat) ) * sin( radians( latitude ) ) ) )
AS distance
FROM {{driver}} a
HAVING distance < $max_radius
$and
ORDER BY is_sponsored DESC, distance ASC
LIMIT 0,100
Итак, вот что я попробовал, но все равно он получает сообщение об ошибке:
public function val_getdistance()
{
//sample value
$radius=3;
$property =
Driver::select(
DB::raw("title, latitude, longitude, ( 3959 * acos( cos( radians(:latitude) ) *
cos( radians( latitude ) ) * cos( radians( longitude ) - radians(:longitude) ) +
sin(radians(:lat_i) ) * sin( radians( latitude ) ) ) ) AS distance"),
["latitude" => $lat, "longitude" => $lng, "lat_i" => $lat])
->having("distance", "<", "$radius")
->orderBy("distance")
->take(20)
->setBindings([$lat, $lng, $lat, $radius])
->get();
dd($property);
}
Вам необходимо отправить значения в функцию, чтобы она выглядела следующим образом, так как $lng
а также $lat
не определены нигде
public function val_getdistance($lng, $lat)
{
//sample value
$radius=3;
$property =
Driver::select(
DB::raw("title, latitude, longitude, ( 3959 * acos( cos( radians(:latitude) ) *
cos( radians( latitude ) ) * cos( radians( longitude ) - radians(:longitude) ) +
sin(radians(:lat_i) ) * sin( radians( latitude ) ) ) ) AS distance"),
["latitude" => $lat, "longitude" => $lng, "lat_i" => $lat])
->having("distance", "<", "$radius")
->orderBy("distance")
->take(20)
->setBindings([$lat, $lng, $lat, $radius])
->get();
dd($property);
}
С помощью этого объявления вы будете отправлять lng и lat (предполагая, что они должны быть динамическими) в функцию самостоятельно, вы можете добавить любой другой параметр, который вам нужен в объявлении функции.
Если вам нужна статика, вы можете указать, где $radius
есть, поэтому чуть ниже / выше радиуса добавьте вот так, а остальная часть вашего кода останется неизменной:
$lng = 42.2039;
$lat = 29.3901;
или любые другие значения, которые вам нужны.
Надеюсь это поможет.
Других решений пока нет …