API 平台原始查询

问题描述

任何人都知道如何在 API 平台控制器/处理程序中获取原始查询

我正在尝试做类似的事情

 $temp_table_query = $this->entityManager->createquery('CREATE TEMPORARY TABLE {temp_validation_code_table} LIKE {validation_code}');
        $qb = $this->entityManager->createqueryBuilder();
        $qb = $qb->select('LOAD DATA LOCAL INFILE {$file} INTO TABLE {temp_validation_code_table} (code) SET offer = {$offer}');

在插入实际数据库表之前尝试将文件数据加载到临时表中进行验证

解决方法

这需要使用底层 Doctrine PDO 抽象(Doctrine\DBAL\Connection)来完成,它可以通过 $entityManager->getConnection(); 获得。

但是,首先,您需要确保将基础 PDO 连接配置为允许 LOAD LOCAL INFILE(通过将 PDO::MYSQL_ATTR_LOCAL_INFILE 设置为 true)。这可以通过提供以下 Doctrine 配置(在 doctrine.yaml 中)来完成:

doctrine:
    dbal:
        #...
        options:
            1001: true # This sets PDO::MYSQL_ATTR_LOCAL_INFILE to true

请注意,允许 LOAD LOCAL INFILE 可能会引入安全漏洞。

假设我有一个名为 example.csv 的文件,其中包含以下 CSV 数据:

1,"foo"
2,"bar"
3,"baz"

然后我可以使用 Doctrine PDO 抽象插入这些数据:

<?php
//...
// Local path to the CSV file
$file = __DIR__ . '/example.csv';
// Obtaining the PDO connection
$connection = $this->entityManager->getConnection();
// Creating the temporary table
$connection->executeStatement('CREATE TEMPORARY TABLE foobar (id int AUTO_INCREMENT PRIMARY KEY,name VARCHAR(256) NOT NULL)');
// Inserting the CSV data
$connection->executeStatement("LOAD DATA LOCAL INFILE '$file' INTO TABLE foobar FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'");