Не использовать подготовленные заявления в Laravel Eloquent ORM?
Можно ли с помощью Eloquent ORM выполнить запрос без использования подготовленных операторов? Или я должен использовать whereRaw()
?
Мне нужно использовать необработанный запрос, потому что я пытаюсь взаимодействовать с InfiniDB, в которой отсутствует поддержка подготовленных операторов из PHP. В любом случае, все запросы будут использовать данные, сгенерированные внутри, а не пользовательский ввод, поэтому это не должно быть проблемой безопасности.
2 ответа
Для всего, кроме SELECT
ты можешь использовать unprepared()
DB::unprepared($sql);
Для неподготовленных SELECT
Вы можете использовать обычный PDO query()
получая доступ к активному соединению PDO через getPdo()
$pdo = DB::getPdo();
$query = $pdo->query($sql);
$result = $query->fetchAll();
Есть простой способ сделать это. В файлеconfig/database.php
вы можете указать параметры для php PDO следующим образом:
'mysql_unprepared' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PROXY_PORT', '6033'),
'username' => env('DB_CACHED_USERNAME', 'forge'),
'password' => env('DB_CACHED_PASSWORD', ''),
'database' => env('DB_DATABASE', 'forge'),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? [
PDO::ATTR_EMULATE_PREPARES => true,
] : [],
'modes' => [
'ONLY_FULL_GROUP_BY',
'STRICT_TRANS_TABLES',
'NO_ZERO_IN_DATE',
'NO_ZERO_DATE',
'ERROR_FOR_DIVISION_BY_ZERO',
'NO_ENGINE_SUBSTITUTION',
],
],
Как видите, есть вариантPDO::ATTR_EMULATE_PREPARES
который при установке наtrue
, выполнит действие, подобное подготовке, на уровне приложения и вместо этого отправит запрос в неподготовленном виде. Я не думал, что у PDO есть эта опция, пока я уже не создал расширение для драйвера mysql Laravel только для перехвата запросов выбора и выполнения неподготовленныхmysqli
запросы вместо этого, чтобыProxySql
мог кэшировать их.
Так что этот ответ мог быть намного сложнее. Ваше здоровье.