【问题标题】:TYPO3: How do i change a part of a string in the database with QueryBuilder?TYPO3:如何使用 QueryBuilder 更改数据库中字符串的一部分?
【发布时间】:2021-09-12 09:21:12
【问题描述】:

我正在使用 TYPO3 10,我想更改 tt_content 表中 pi_flexform 列中的特定文本/单词。

概念:我想使用 QueryBuilder 将表单文件夹从 user_upload 迁移到 form_definitions(将项目从 TYPO3 8 更新到 10)。

我可以将 form_definitions 文件夹覆盖回 user_upload,但我想要一个干净的结构。现在,如果我更改表格所在的文件夹,表格将不再起作用,因为在数据库和 pi_flexform 列中存在以下内容:

...
<field index="settings.persistenceIdentifier">
      <value index="vDEF">1:/user_upload/NameOfTheForm.form.yaml</value>
</field>
...

我想要的是将1:/user_upload/ 更改为1:/form_definitions/

我知道我必须将 UPDATE & SET 与 QueryBuilder 一起使用,但我不知道如何将它用于字符串中的特定字符串。

我如何做到这一点?

【问题讨论】:

    标签: database text replace typo3 query-builder


    【解决方案1】:

    为了替换列中的特定文本/单词,可以使用 QueryBuilder 的 UPDATE & SET 函数。它看起来像这样:

    $queryBuilder = $this->connection->createQueryBuilder();
    $queryBuilder->getRestrictions()->removeAll();
    $queryBuilder
        ->update('tt_content')
        ->where(
            $queryBuilder->expr()->andX(
                $queryBuilder->expr()->like(
                    'tt_content.pi_flexform',
                       $queryBuilder->createNamedParameter(
                          '%user_upload%',
                          Connection::PARAM_STR
                       )
                 )
             )
         )
         ->set(
             'tt_content.pi_flexform',
             sprintf(
                 'REPLACE(tt_content.pi_flexform, %s, %s)',
                  $queryBuilder->createNamedParameter('user_upload', Connection::PARAM_STR),
                  $queryBuilder->createNamedParameter('form_definitions', Connection::PARAM_STR)
             ),
             false
         )
         ->execute();
    

    分解代码:

    $queryBuilder = $this->connection->createQueryBuilder();
    $queryBuilder->getRestrictions()->removeAll();
    

    我们初始化查询并且我们正在移除所有限制。 QueryBuilder 仅对未设置为 deleted=1hidden =1 的条目执行。我们希望对所有条目执行更新后的路径,因此我们删除了限制。

    $queryBuilder->expr()->like(
       'tt_content.pi_flexform',
           $queryBuilder->createNamedParameter(
           '%user_upload%',
            Connection::PARAM_STR
        )
     )
    

    我们只想更新 pi_flexform 列中存在单词 user_upload 的条目。

     ->set(
         'tt_content.pi_flexform',
         sprintf(
             'REPLACE(tt_content.pi_flexform, %s, %s)',
              $queryBuilder->createNamedParameter('user_upload', Connection::PARAM_STR),
              $queryBuilder->createNamedParameter('form_definitions', Connection::PARAM_STR)
         ),
         false
     )
     ->execute();
    

    我们使用 SQL REPLACE 命令来查找单词并替换它。使用$queryBuilder-&gt;createNamedParameter(),我们可以避免 SQL 注入。


    希望对你有帮助

    最好的问候

    【讨论】:

      【解决方案2】:

      您还可以使用原始数据库查询

      $connection->query('Your raw query');
      

      请注意,这仅适用于特定的数据库类型,您需要自己注意安全性。

      【讨论】:

        猜你喜欢
        • 2020-11-17
        • 2013-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多