Как привязать параметры к необработанному запросу БД в Laravel, который используется на модели?

Re,

У меня есть следующий запрос:

$property = Property::select( DB::raw("title, lat, lng, ( 3959 * acos( cos( radians(:lat) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(:lng) ) + sin( radians(:lat) ) * sin( radians( lat ) ) ) ) AS distance", ["lat" => $lat, "lng" => $lng, "lat" => $lat]) ) ->having("distance", "<", $radius) ->orderBy("distance") ->take(20) ->get(); 

Он не работает: Invalid parameter number: mixed named and positional parameters .

Кто-нибудь знает трюк или обходной путь (я, очевидно, могу написать полный запрос, но предпочитаю использовать свободный строитель).

Хорошо, после некоторых экспериментов, вот решение, с которым я столкнулся:

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

В принципе, setBindings должен быть вызван setBindings . Пожелайте, чтобы это было документировано!

Старый вопрос, но если нам нужно повторить переменную, мы должны изменить ее значение ключа в массиве bindings.

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

Достаточно.

почему нет?

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

Я столкнулся с той же проблемой совсем недавно, и ответ заключается в том, что сообщение об ошибке mixed named and positional parameters . В вашем случае :lat и :lng называются параметрами, в то время как у вас есть $radius как позиционный. Таким образом, одним из возможных исправлений для вашей проблемы является использование havingRaw() и применение именованных параметров.

--havingRaw('distance < :radius', ['radius' => $radius])

 $select = <<<SQL title, lat, lng, (3959*acos(cos(radians( ? ))*cos(radians(lat))*cos(radians(lng)-radians( ? ))+sin(radians( ? ))*sin(radians(lat)))) AS distance SQL; $property = Property::selectRaw($select, [$lat, $lng, $lat]) ->having('distance', '<', $radius) ->orderBy('distance') ->take(20)->get(); 

Я поместил соседний поиск из Doctrine v1 в Laravel, проверьте здесь.

Просто добавьте Geographical характеристику к модели, которую вы можете сделать:

 $model->newDistanceQuery($request->query('lat'), $request->query('lon'))->orderBy('miles', 'asc')->get(); 

Он работает с помощью selectRaw со связями, подобными этому:

 $sql = "((ACOS(SIN(? * PI() / 180) * SIN(" . $latName . " * PI() / 180) + COS(? * PI() / 180) * COS(" . $latName . " * PI() / 180) * COS((? - " . $lonName . ") * PI() / 180)) * 180 / PI()) * 60 * ?) as " . $unit; if($kilometers){ $query->selectRaw($sql, [$lat, $lat, $lon, 1.1515 * 1.609344]); } else{ // miles $query->selectRaw($sql, [$lat, $lat, $lon, 1.1515]); }