Laravel Query Builder, выберите Raw или выберите и сырье - PullRequest
0 голосов
/ 17 мая 2018

Какая разница между:

DB::table('some_table')
->selectRaw('COUNT(*) AS result')
->get();

и

DB::select(DB::raw(" 
SELECT COUNT(*) AS result
FROM some_table"));

В документации https://laravel.com/docs/5.6/queries они сообщают об использовании raw() из-за SQL-инъекции, но то же самое с selectRaw?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Конечный результат обоих одинаков, то есть, но есть некоторые различия:

Первый:

DB::table('some_table')
    ->selectRaw('COUNT(*) AS result')
    ->get();
  • Возвращает коллекцию объектов PHP,
  • Вы можете свободно вызывать метод коллекций для результата
  • Он чище.

В то время как второй:

DB::select(DB::raw(" 
    SELECT COUNT(*) AS result
    FROM some_table"
));
  • Возвращает массив объекта Php.

Хотя они имеют сходство: необработанная строка запроса.

0 голосов
/ 17 мая 2018

Эти два примера дают один и тот же результат, хотя и с разными типами данных результата.

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

Однако это можно очень легко уменьшить, используя привязки, передаваемые в качестве второго параметра любого необработанного метода запроса, как показано в той же документации (selectRaw принимает второй параметр как массив привязок, а также другие необработанные методы из Query Builder, такие как whereRaw и т. Д.).На самом деле в начале страницы docs , на которую вы ссылались, во втором абзаце также говорится следующее:

Конструктор запросов Laravel использует привязку параметров PDO для защиты вашего приложения от атак внедрения SQL,Нет необходимости чистить строки, передаваемые как привязки.

Поэтому, если вы будете осторожны и убедитесь, что все параметры передаются как привязки, а не объединяются в виде простых значений в необработанной строке запроса, вы должны быть в безопасности.

...