How to bind parameters to a raw DB query in Laravel that's used on a model?
OK, after some experimenting, here's the solution that I came up with:
$property = Property::select( DB::raw("title, lat, lng, ( 3959 * acos( cos( radians( ? ) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians( ? ) ) * sin( radians( lat ) ) ) ) AS distance") ) ->having("distance", "<", "?") ->orderBy("distance") ->take(20) ->setBindings([$lat, $lng, $lat, $radius]) ->get();
Basically, setBindings
has to be called on the query. Wish this was documented!
Old question, but if we have to repeat a variable, we have to change its key value in the bindings array.
$property = Property::select( DB::raw("title, lat, lng, ( 3959 * acos( cos( radians(:lat) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(:lng) ) + sin(radians(:lat_i) ) * sin( radians( lat ) ) ) ) AS distance"), ["lat" => $lat, "lng" => $lng, "lat_i" => $lat]);
That's enough.
why not?
$latitude = $request->input('latitude', '44.4562319000'); $longitude = $request->input('longitude', '26.1003480000'); $radius = 1000000; $locations = Locations::selectRaw("id, name, address, latitude, longitude, image_path, rating, city_id, created_at, active, ( 6371 * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( latitude ) ) ) ) AS distance", [$latitude, $longitude, $latitude]) ->where('active', '1') ->having("distance", "<", $radius) ->orderBy("distance") ->get();