如何在TYPO3 Query Builder中编写WHERE IN子句?
解决方案
1. 使用Query Builder构建子查询(推荐)
TYPO3 Query Builder原生支持子查询作为IN条件的数据源,这种方式能自动处理表名前缀、标识符转义,还能避免SQL注入风险,完全符合TYPO3的开发规范。
示例代码:
// 获取主表对应的Query Builder实例 $queryBuilder = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( \TYPO3\CMS\Core\Database\ConnectionPool::class )->getQueryBuilderForTable('your_main_table'); // 创建子查询的Query Builder实例 $subQuery = $queryBuilder->createQueryBuilder(); $subQuery ->select('uid_local') ->from('your_related_table') // 可按需添加子查询的过滤条件 ->where( $subQuery->expr()->eq( 'foreign_table', $subQuery->createNamedParameter('your_main_table', \TYPO3\CMS\Core\Database\Connection::PARAM_STR) ) ); // 主查询中绑定IN子查询 $result = $queryBuilder ->select('*') ->from('your_main_table') ->where( $queryBuilder->expr()->in( 'uid', $subQuery ) ) ->executeQuery() ->fetchAllAssociative();
2. 直接使用原生SQL片段
如果场景特殊需要手写原生SQL部分,可通过where()或andWhere()方法直接传入SQL字符串,但必须注意标识符转义和参数绑定,绝对避免硬编码动态值引发SQL注入:
无动态参数的场景
$queryBuilder = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( \TYPO3\CMS\Core\Database\ConnectionPool::class )->getQueryBuilderForTable('your_main_table'); $result = $queryBuilder ->select('*') ->from('your_main_table') // 用quoteIdentifier处理表名,避免关键字冲突 ->where( 'uid IN (SELECT uid_local FROM ' . $queryBuilder->quoteIdentifier('your_related_table') . ')' ) ->executeQuery() ->fetchAllAssociative();
带动态参数的场景
$dynamicValue = 'your_target_value'; $queryBuilder = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( \TYPO3\CMS\Core\Database\ConnectionPool::class )->getQueryBuilderForTable('your_main_table'); $result = $queryBuilder ->select('*') ->from('your_main_table') ->where( 'uid IN (SELECT uid_local FROM ' . $queryBuilder->quoteIdentifier('your_related_table') . ' WHERE some_field = :dynamicValue)' ) ->setParameter('dynamicValue', $dynamicValue, \TYPO3\CMS\Core\Database\Connection::PARAM_STR) ->executeQuery() ->fetchAllAssociative();
TYPO3 Query Builder没有专门的addWhereLiteral类方法,但where()/andWhere()本身支持传入原生SQL片段,只要做好安全处理即可。
内容的提问来源于stack exchange,提问作者Niffin
相关产品推荐
相关产品推荐

