有没有办法在 TYPO3 9 中执行原始 SQL 查询?
相当于$GLOBALS['TYPO3_DB']->sql_query($sql);
以前版本的东西。
在您的存储库中,您可以使用statement()
它。
例子:
$query = $this->createQuery();
$sql = '
SELECT fieldA, fieldB
FROM table
WHERE
pid = '.$pid.'
AND someField = 'something'
';
$query->statement($sql)->execute();
确保您负责清理输入!
你可以使用querybuilder
with 它的方法
TYPO3\CMS\Core\Database\Query\QueryBuilder::selectLiteral(string ... $selects)
。
意识到:
指定要在查询结果中返回的项目。替换任何先前指定的选择(如果有)。这应该只用于文字 SQL 表达式,因为不会对项目执行任何类型的引用/转义。
还有
TYPO3\CMS\Core\Database\Query\QueryBuilder::addSelectLiteral(string ... $selects)
添加要在查询结果中返回的项目。这应该只用于文字 SQL 表达式,因为不会对项目执行任何类型的引用/转义。
ORM 概念似乎使使用原始 SQL 变得困难。
/**
* @param string $tableName
* @return bool
*/
public function createMySplitTable($newTableName = self::TABLENAME)
{
if ($newTableName !== self::TABLENAME) {
$baseTable = self::TABLENAME;
// make a structure-copy of the main table
$sql ="CREATE TABLE $newTableName SELECT * FROM $baseTable AS main LIMIT 0;";
// looky-looky at 20200609: https://www.strangebuzz.com/en/snippets/running-raw-sql-queries-with-doctrine
// seems to work
/** @var Connection $connection */
$connection = GeneralUtility::makeInstance(ConnectionPool::class)
->getConnectionForTable(self::TABLENAME);
/** @var DriverStatement $statement */
$statement = $connection->prepare($sql);
$statement->execute();
// // --- don't work for me :-(
// /** @var QueryBuilder $queryBuilder */
// $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
// ->getQueryBuilderForTable($baseTable);
// $queryBuilder->resetRestrictions();
// $queryBuilder->resetQueryParts();
// $queryBuilder->add($sql,'select'); // Tried some variations
// $queryBuilder->execute();
// // --- don't work for me :-(
// /** @var Query $query */ // Extbase won't work for this query
// $query = $this->createQuery();
// $query->statement($sql);
// $query->execute(true);
// // --- work only for TYPO3 8 and lower
// $GLOBALS['TYPO3_DB']->sql_query($sql); /// < TYPO3 8
//
}
}
感谢https://www.strangebuzz.com/en/snippets/running-raw-sql-queries-with-doctrine