我正在尝试在我创建的自定义Drupal 8模块中切换并查询外部数据库。
我已在 settings.php 中将外部数据库添加到本机数据库下面:
// Add second database
$databases['external']['default'] = array(
'database' => 'uconomy_external',
'username' => 'uconomy_admin',
'password' => 'fNjA9kC35h8',
'prefix' => '',
'host' => 'localhost',
'port' => '3306',
'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
'driver' => 'mysql',
);
然后我有一个名为 BusinessListingDbLogic.php 的文件,我在其中查询数据库:
<?php
namespace Drupal\business_listing;
use Drupal\Core\Database\Connection;
use Drupal\Core\Database\Database;
/**
* Defines a storage handler class that handles the node grants system.
*
* This is used to build node query access.
*
* This class contains all the logic for interacting with our database
*
* @ingroup business_listing
*/
class BusinessListingDbLogic {
/**
* @var \Drupal\Core\Database\Connection
*/
protected $database;
/**
* @param \Drupal\Core\Database\Connection $connection
*/
public function __construct(Connection $connection) {
$this->database = $connection;
//Database::setActiveConnection('external');
}
/**
* Add new record in table business_listing.
*/
public function add($title, $body, $imageName, $location, $email) {
if (empty($title) || empty($body) || empty($imageName) || empty($location) || empty($email)) {
return FALSE;
}
// add record to business_listing table in database.
$query = $this->database->insert('business_listing');
$query->fields(array(
'title' => $title,
'body' => $body,
'image' => $imageName,
'location' => $location,
'email' => $email
));
return $query->execute();
}
我相信我的BusinessListingDbLogic类被注册为服务,我的 business_listing.services.yml 看起来如下:
services:
# Service Name.
business_listing.database.external:
class: Drupal\Core\Database\Connection
factory: 'Drupal\Core\Database\Database::getConnection'
arguments: ['external']
# external database dependent serivce.
business_listing.db_logic:
# Class that renders the service.
# BusinessListingDbLogic contains all the functions we use to interact with the business_listings table
class: Drupal\business_listing\BusinessListingDbLogic
# Arguments that will come to the class constructor.
arguments: ['@business_listing.database.external']
# A more detailed explanation: https://www.drupal.org/node/2239393.
# tags:
# - { name: backend_overridable }
此代码有效,直到我尝试取消注释Database::setActiveConnection('external');
然后,我得到以下错误:
网站遇到意外错误。请稍后再试。Drupal \ Core \ Database \ DatabaseExceptionWrapper:SQLSTATE [42S02]:找不到基表或视图:1146表'uconomy_external.shortcut_set_users'不存在:SELECT ssu.set_name AS set_name 从 {shortcut_set_users} ssu WHERE ssu.uid =:db_condition_placeholder_0;数组 ( [:db_condition_placeholder_0] => 1 )
开关似乎可以正常工作,但是Drupal可能正在尝试使用外部数据库来实现其本机功能?我知道我有时也必须切换回默认数据库,但是我不确定该在哪里做?
任何帮助或建议将不胜感激。亲切的问候,马特
答案 0 :(得分:1)
似乎需要直接使用静态方法Database::setActiveConnection()
来代替调用当前连接来进行设置。
例如。 $this->database->setActiveConnection('external')
成为Database::setActiveConnection('external')