如何在不更改活动连接的情况下更新第二个数据库



我正在使用Drupal 9.2.10,并希望更新不在默认数据库中的数据库条目。

当使用选择和加入时,我使用:

$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,但会失败
我可以通过DrupalCoreDatabaseDatabase::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通过用花括号括起表名来强制添加活动表:

$query = $comments . 'UPDATE {' . $this->connection->escapeTable($this->table) . '} SET ' . implode(', ', $update_fields);

在Drupal\Core\Database\Query\Select to String((中,Drupal通过如下构建查询来识别表名为complete db_name.table_name的可能性:

if (strpos($table_string, '.') === FALSE) {
$table_string = '{' . $table_string . '}';
}  

不知道为什么不同。

***编辑***
请参阅Drupal网站上的问题:https://www.drupal.org/project/drupal/issues/3253479#comment-14334898

最新更新