Подтвердить что ты не робот

Laravel whereRaw с параметрами не работает?

В соответствии с документацией это должно работать:

return $query->whereRaw("lang =  '?'",array(App::getLocale()));

Но это не работает, пока это работает:

return $query->whereRaw("lang =  '".App::getLocale()."'");

Что я делаю неправильно? Вот документация

$users = User::whereRaw('age > ? and votes = 100', array(25))->get();
4b9b3361

Ответ 1

Нет необходимости ставить кавычки вокруг "?" заполнители. Просто попробуйте:

return $query->whereRaw("lang = ?",array(App::getLocale()));

Из документации PHP о PDO (которая должна быть действительна и здесь):

Для тех, кто задается вопросом, почему добавление котировок вокруг заполнителя неверно и почему вы не можете использовать заполнители для имен таблиц или столбцов: Существует общее заблуждение о том, как работают заполнители в подготовленных операциях: они не просто заменяются как строки (экранированные), а результирующий SQL выполняется. Вместо этого СУБД, попросив "подготовить" выражение, содержит полный план запросов о том, как он будет выполнять этот запрос, включая те таблицы и индексы, которые он будет использовать, которые будут одинаковыми независимо от того, как вы заполняете заполнители.

План "SELECT name FROM my_table WHERE id =: value" будет таким же, как вы заменяете ": значение", но похожее "SELECT name FROM: table WHERE id =: value" не может быть запланировано, потому что СУБД не имеет понятия, какую таблицу вы собираетесь выбрать.

Даже при использовании "эмулированных подготавливаний" PDO не может позволить вам использовать местозаполнители где угодно, потому что ему придется разобраться в том, что вы имели в виду: "Выберите: foo From some_table" означает "foo" будет ссылкой на столбец, или буквальная строка?

Когда ваш запрос использует динамическую ссылку на столбец, вы должны явно указывать столбцы, которые, как вы знаете, существуют в таблице, например. используя оператор switch с исключением, указанным в предложении по умолчанию: