Я пытаюсь привязать вары к моему необработанному запросу:

$data = $myModel->select( DB::raw('(3959 * acos(cos(radians(:lat)) * cos(radians(lat)) * cos(radians(lng) - radians(:lng)) + sin(radians(:lat)) * sin(radians(lat)))) as distance'), array(
        'lat' => $lat, 'lng' => $lng,
    ))->orderBy('distance', 'ASC')->having('distance', '<', $radius)
    ->get();

Я проверил различные сообщения SO, которые привели к этому сообщению в блоге:

http://fideloper.com/laravel-raw-queries

Я все еще получаю сообщение об ошибке:

strtolower() expects parameter 1 to be string, array given

Где я ошибаюсь?

3
panthro 1 Июн 2015 в 17:34
К сожалению, мне нужен экземпляр - у меня есть несколько операторов if позже, чтобы определить некоторые предложения where.
 – 
panthro
1 Июн 2015 в 17:47

1 ответ

Лучший ответ

Вы должны связывать переменные с методом raw, а не select:

$select = "(3959 * acos(cos(radians(:lat)) * cos(radians(lat)) * cos(radians(lng) - radians(:lng)) + sin(radians(:lat)) * sin(radians(lat)))) as distance";
$data = $myModel->select( DB::raw($select,array(
    'lat' => $lat, 'lng' => $lng,
)))->orderBy('distance', 'ASC')->having('distance', '<', $radius)
->get();

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

$data = $myModel->selectRaw($select,array(
    'lat' => $lat, 'lng' => $lng,
))->orderBy('distance', 'ASC')->having('distance', '<', $radius)
->get();
2
Razor 1 Июн 2015 в 17:53
Спасибо, теперь я получаю эту ошибку: Недопустимый номер параметра: смешанные именованные и позиционные параметры (SQL: select (3959 * acos (cos (радианы (: lat)) * cos (радианы (lat)) * cos (радианы (lng) - радианы (: lng)) + sin (радианы (: lat)) * sin (радианы (lat)))) как расстояние от users, имеющее distance <1 порядок по distance по возрастанию)
 – 
panthro
1 Июн 2015 в 18:01
1
Замените именованные привязки вопросительными знаками (?): $data = $myModel->selectRaw("(3959 * acos(cos(radians(?)) * cos(radians(lat)) * cos(radians(lng) - radians(?)) + sin(radians(?)) * sin(radians(lat)))) as distance",array($lat, $lng, $lat))->orderBy('distance', 'ASC')->having('distance', '<', $radius) ->get(); (также обратите внимание на обновленный массив привязок).
 – 
patricus
1 Июн 2015 в 18:54