Не использовать подготовленные заявления в 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мог кэшировать их.

Так что этот ответ мог быть намного сложнее. Ваше здоровье.

Другие вопросы по тегам