I need to copy some entities from one Drupal 9 database to different Drupal 9 database. I have searched and looked high and low, but none of the examples I have found work anywhere. I found no help on drupal.org, so I'm reaching out here.
Both databases are full Drupal 9 databases; they are almost identical, but some nodes and users are present in one, which I need to copy to the other.
In Drupal 7 it was fairly simple. With both databases present in settings.php, let's say they were 'default' and 'second_db', I could then do something along these lines.
// Switch to second database
db_set_active('second_db');
// Read a user record
$user = user_load($some_uid);
// Switch back to regular db
db_set_active();
// I now have data for the user from the second database and can manipulate and save as I please in the current db
// Create a new user in the default db - just illustrating, not tested!
unset($user->uid);
$user->name .= ' copy';
user_save('', (array)$user);
The beauty of this was that two simple lines with db_set_active could switch ALL database activity to another database.
db_set_active('second_db');
// Everything here will work on second_db
db_set_active();
// Now everything works on the default db
All calls to Drupal functions would work, but just get and write data from and to second_db.
How do I get this exact behavior in Drupal 9?
I tried with \Drupal\Core\Database\Database::setActiveConnection('second_db')
, but I can't get that to change the globally active database. \Drupal\user\Entity\User::load($uid)
still reads from the current database and not from second_db.
With the following code, $account
is empty, although the user is there in the second_db.
\Drupal\Core\Database\Database::setActiveConnection('second_db');
$account = user_load_by_name('Some name only in second_db');
\Drupal\Core\Database\Database::setActiveConnection();
I have also played with $connection = \Drupal\Core\Database\Database::getConnection('second_db');
which returns a database connection that can be used for queries in that database, but I need to change the database for all queries, also the ones performed by core and other modules than my own.
I have seen advice on using \Drupal\Core\Database\Database::addConnectionInfo();
but that's not the magic key as far as I can see.
What's the secret spice that will switch all database calls back and forth between two databases in Drupal 9?