繁体   English   中英

TYPO3:如何使用 QueryBuilder 更改数据库中字符串的一部分?

[英]TYPO3: How do i change a part of a string in the database with QueryBuilder?

我正在使用 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 一起使用,但我不知道如何将它用于字符串中的特定字符串。

我如何实现这一目标?

为了替换列中的特定文本/单词,可以使用 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->createNamedParameter()我们可以避免 SQL 注入。


希望有帮助

此致

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM