You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:43:10