为了替换列中的特定文本/单词,可以使用 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=1 或 hidden =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 注入。
希望对你有帮助
最好的问候