【问题标题】:How to create a dynamic 'WHERE' SQL clause using TYPO3 Querybuilder如何使用 TYPO3 Querybuilder 创建动态的“WHERE”SQL 子句
【发布时间】:2018-03-08 23:41:58
【问题描述】:

请问如何在 TYPO3 数据库查询中为“WHERE”子句动态添加额外条件?新的 TYPO3 版本 8 文档说明了如何进行固定查询,而不是可变查询。

过去,我可以创建一条 SQL 语句并像这样动态修改它:

if (condition) {  
    $strWhere = 'some SQL';  
} else {  
    $strWhere = 'same SQL with extra bits'; 
}

$dbRes = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
    "*",            // SELECT ...
    "tableName",    // FROM ...
    $strWhere ,     // WHERE...
    etc.

我看不到如何使用 Querybuilder 执行此类操作。我想要实现的是这样的表达式

if (condition) { 
    ->where($queryBuilder->expr()->eq(... ))   
    }
else {
    ->where($queryBuilder->expr()->eq(... ))
    ->andWhere($queryBuilder->expr()->eq(... ))
}

任何提示将不胜感激。谢谢。

【问题讨论】:

  • 和你上面建议的差不多。您可以在一个数组中收集多个 where 条件 ($queryBuilder->expr()),然后使用 orX 或 andX 连接它们: $queryBuilder->andWhere($queryBuilder->expr()->orX(... $yourWhereExperessions);
  • 感谢 deadfishli,您的回复非常有帮助,您也很友善。抱歉延迟回复。

标签: typo3 query-builder


【解决方案1】:

解决了。我的错误在于认为 Query builder 语句的各个部分必须放在一起 - 他们没有。

所以:

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_tablename');

$queryBuilder
   ->select('uid', 'header', 'bodytext')
   ->from('tt_content')
   ->where(
      $queryBuilder->expr()->eq('bodytext', $queryBuilder->createNamedParameter('klaus')),
      $queryBuilder->expr()->eq('header', $queryBuilder->createNamedParameter('a name'))
   )
   ->execute();

也可以拆分成部分,如:

switch ($scope) {
     case 'limitfields':
       $queryBuilder->select('uid','header','bodytext');
       break;

     default:
       $queryBuilder->select('*');
       break;
   }

$queryBuilder
    ->from('tt_content')
    ->where(
       $queryBuilder->expr()->eq('bodytext', $queryBuilder->createNamedParameter('klaus')),
       $queryBuilder->expr()->eq('header', $queryBuilder->createNamedParameter('a name'))
    )
    ->execute();

【讨论】:

    【解决方案2】:
    $queryBuilder = GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Database\\ConnectionPool')->getQueryBuilderForTable('tx_igldapssoauth_config');
    
    $expressionBuilder = $queryBuilder->expr();
    
    $conditions = $expressionBuilder->andX();
    $conditions->add(
        $expressionBuilder->eq('somefield', 1)
    );
    $conditions->add(
        $expressionBuilder->eq('someotherfield', 2)
    );
    
    $rows = $queryBuilder->select('*')
    ->from('tx_igldapssoauth_config')
    ->where(
        $queryBuilder->expr()->eq('uid', 1)
    )
    ->andWhere($conditions)
    ->execute()->fetchAll();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 2012-10-02
      相关资源
      最近更新 更多