Drupal 9:如何在不更改活动连接的情况下更新第二个数据库
Drupal 9: how to update a second db without changing the active connection
我正在使用 Drupal 9.2.10 并想更新不在默认数据库中的数据库条目
当使用 select 并加入时,我使用:
$query = \Drupal::database()->select('default.table1', 'table1');
$query->leftJoin('db_name2.table2', 'table2', 'table2.id=table1.id);
效果很好
然而,
当尝试通过 \Drupal::database()->update('db_name2.table2')
更新第二个数据库中的行时,Drupal 将添加默认数据库的前缀,因此实际上会尝试更新 default.db_name2.table2
,这将失败
我可以通过 \Drupal\Core\Database\Database::setActiveConnection('db_name2');
设置活动数据库
但是想避免它,而是使用数据库名称
我尝试了以下但没有成功:
\Drupal::database()->update('`db_name2.table2`')`
\Drupal::database()->update('"db_name2.table2"')`
\Drupal::database()->update('{db_name2.table2}')`
你能帮忙吗?
谢谢
艾夫纳
在 Drupal\Core\Database\Query\Update __toString() 中,Drupal 通过用大括号括起 table 名称强制添加活动 table:
$query = $comments . 'UPDATE {' . $this->connection->escapeTable($this->table) . '} SET ' . implode(', ', $update_fields);
在 Drupal\Core\Database\Query\Select toString() 中,Drupal 通过如下构建查询来识别 table 名称是完整 db_name.table_name 的可能性:
if (strpos($table_string, '.') === FALSE) {
$table_string = '{' . $table_string . '}';
}
不知道为什么不一样。
*** 编辑 ***
请参考 Drupal 站点上的问题:
https://www.drupal.org/project/drupal/issues/3253479#comment-14334898
我正在使用 Drupal 9.2.10 并想更新不在默认数据库中的数据库条目
当使用 select 并加入时,我使用:
$query = \Drupal::database()->select('default.table1', 'table1');
$query->leftJoin('db_name2.table2', 'table2', 'table2.id=table1.id);
效果很好
然而,
当尝试通过 \Drupal::database()->update('db_name2.table2')
更新第二个数据库中的行时,Drupal 将添加默认数据库的前缀,因此实际上会尝试更新 default.db_name2.table2
,这将失败
我可以通过 \Drupal\Core\Database\Database::setActiveConnection('db_name2');
设置活动数据库
但是想避免它,而是使用数据库名称
我尝试了以下但没有成功:
\Drupal::database()->update('`db_name2.table2`')`
\Drupal::database()->update('"db_name2.table2"')`
\Drupal::database()->update('{db_name2.table2}')`
你能帮忙吗?
谢谢
艾夫纳
在 Drupal\Core\Database\Query\Update __toString() 中,Drupal 通过用大括号括起 table 名称强制添加活动 table:
$query = $comments . 'UPDATE {' . $this->connection->escapeTable($this->table) . '} SET ' . implode(', ', $update_fields);
在 Drupal\Core\Database\Query\Select toString() 中,Drupal 通过如下构建查询来识别 table 名称是完整 db_name.table_name 的可能性:
if (strpos($table_string, '.') === FALSE) {
$table_string = '{' . $table_string . '}';
}
不知道为什么不一样。
*** 编辑 ***
请参考 Drupal 站点上的问题:
https://www.drupal.org/project/drupal/issues/3253479#comment-14334898