【问题标题】:How to make an regexp request with TYPO3 queryBuilder如何使用 TYPO3 queryBuilder 发出正则表达式请求
【发布时间】:2020-07-29 06:44:58
【问题描述】:

我目前在我的 TYPO3 分机中有一个很大的条目列表,这导致站点的加载时间很差,所以我想按字母顺序拆分条目列表。为此,我使用 queryBuilder 仅选择那些以 a、b、c 等开头的条目。但是当涉及到数字和特殊字符时,我现在卡住了。我发现了这个:MySQL - If It Starts With A Number Or Special Character 这正是我所需要的。但我不知道如何在 queryBuilder 中创建 REGEXP。有人可以帮忙吗?

TYPO3 版本是 10.4.6

提前致谢

【问题讨论】:

  • 尽管@eliashaeussler 和@Jonas 为您提供了可能有效的解决方案,您应该在第一步中尝试它们,但出于性能原因,我宁愿建议在您的表中添加一个单独的、索引的和隐藏的列存储第一个字符并按它搜索。它总是比使用LIKEREGEXP 搜索快得多。当然,您需要在每次插入或更新记录后添加一些工作来更新该列。如果您对该解决方案感兴趣,请发表评论,我会向您解释如何操作。

标签: mysql regex typo3 query-builder typo3-10.x


【解决方案1】:

我建议使用LIKE 来查找以给定字符开头的字符串。

使用喜欢

$firstCharacter = 'A';

$q = GeneralUtility::makeInstance(ConnectionPool::class)
       ->getQueryBuilderForTable('mytable');
$q->select('field')
  ->from('mytable')
  ->where(
    $q->expr()->orX(
      $q->expr()->like(
        'field',
        $q->quote(strtolower($firstCharacter) . '%')
      ),
      $q->expr()->like(
        'field',
        $q->quote(strtoupper($firstCharacter) . '%')
      );

如果 DBMS 不区分大小写,当然可以忽略大写/小写。

使用正则表达式

@eliashaeussler 举了一个很好的例子。

虽然 LIKE 受 Doctrine dbal 支持,但 REGEXP 不支持。您将失去跨 DBMS 的兼容性。如果您针对特定网站但不应该公开使用extensions,这可能很好。

【讨论】:

    【解决方案2】:

    也许这样的东西适合你:

    use TYPO3\CMS\Core\Database\ConnectionPool;
    use TYPO3\CMS\Core\Utility\GeneralUtility;
    
    $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($tableName);
    $result = $queryBuilder->select('*')
        ->from($tableName)
        ->where(
            $queryBuilder->expr()->comparison(
                $queryBuilder->quoteIdentifier($fieldName),
                'NOT REGEXP',
                $queryBuilder->createNamedParameter('^[[:alpha:]]')
            )
        )
        ->execute()
        ->fetchAll();
    

    这会创建一个这样的查询(假设 $tableName = 'foo'$fieldName = 'baz'):

    SELECT `foo`.*
    FROM `foo`
    WHERE `foo`.`baz` NOT REGEXP '^[[:alpha:]]'
    

    参考:https://github.com/TYPO3/TYPO3.CMS/blob/10.4/typo3/sysext/core/Classes/Database/Query/Expression/ExpressionBuilder.php#L97-L100

    【讨论】:

    • 谢谢你的例子,但我想要每一个特殊的字符和数字,而不是每一个字母。所以我只是在你的REDEXP之前添加了NOT,它就像一个魅力
    猜你喜欢
    • 2013-08-03
    • 2020-06-04
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2021-11-25
    相关资源
    最近更新 更多