Исследуйте необработанные SQL-запросы в Laravel 4

Как можно обойти параметры, переданные в исходный запрос в Laravel 4? Я ожидал чего-то вроде DB::escape() (который звонит из Laravel 3), а также попытался DB::quote() (который, как я думал, может быть доступен через объект PDO )

 $query = DB::select("SELECT * FROM users WHERE users.id = " . DB::escape($userId)); 

Мы не можем использовать метод select с заполнителями, поскольку приведенное выше является просто упрощенным примером того, чего мы пытаемся достичь. У нас есть большой пользовательский запрос с несколькими вложенными запросами выбора, которые нельзя адаптировать к построителю запросов.

Каков наилучший способ избежать чего-то перед вставкой в ​​Laravel 4?

РЕДАКТИРОВАТЬ:

Я только что обнаружил, что вы можете получить доступ к объекту PDO и использовать здесь функцию кавычки. Это лучший подход, или есть более простой способ доступа к этой функции?

 DB::connection()->getPdo()->quote("string to quote"); 

Solutions Collecting From Web of "Исследуйте необработанные SQL-запросы в Laravel 4"

Вы можете процитировать ваши строки таким образом, через фасад DB .

 DB::connection()->getPdo()->quote("string to quote"); 

Я поставил этот ответ в своем вопросе, когда обнаружил его, однако теперь я ставлю его в качестве фактического ответа, чтобы облегчить поиск других.

 $value = Input::get("userID"); $results = DB::select( DB::raw("SELECT * FROM users WHERE users.id = :value"), array( 'value' => $value, )); 

Подробнее ЗДЕСЬ

Вы также можете попробовать это, ( прочитать документацию )

 $results = DB::select('SELECT * FROM users WHERE users.id = ?', array($userId)); 

Я использую это в моем helpers.php в Laravel 5:

 if ( ! function_exists('esc_sql')) { function esc_sql($string) { return app('db')->getPdo()->quote($string); } } 

Затем я могу использовать esc_sql функцию, где мне нужно выполнить pergorm escaping для необработанных SQL-запросов.

Я нашел этот вопрос, когда искал генерации sql-экранов в Laravel. То, что мне действительно нужно было, это экранирование имени таблицы / столбца. Итак, для справок в будущем:

 /** * Quotes database identifier, eg table name or column name. * For instance: * tablename -> `tablename` * @param string $field * @return string */ function db_quote_identifier($field) { static $grammar = false; if (!$grammar) { $grammar = DB::table('x')->getGrammar(); // The table name doesn't matter. } return $grammar->wrap($field); } 

Вот более полный пример, показывающий, как избежать как значений, так и столбцов и расширить конструктор запросов Laravel:

 <?php namespace App\Providers; use Illuminate\Database\Query\Builder; use Illuminate\Support\ServiceProvider; class DatabaseQueryBuilderMacroProvider extends ServiceProvider { public function register() { Builder::macro('whereInSet', function($columnName, $value) { /** @var \Illuminate\Database\Query\Grammars\Grammar $grammar */ $grammar = $this->getGrammar(); return $this->whereRaw('FIND_IN_SET(?,' . $grammar->wrap($columnName) . ')', [$value]); }); } }