我们正在使用 Zend Framework 2 和多个数据库创建一个 Web 应用程序。我有一个core
加载所有客户信息的数据库。该数据库包含customer
表。客户表的字段是::
- ID
- 用户名
- 密码
- 数据库名称
- 顾客姓名
- .....................
当客户登录时,我必须从数据库中加载他的数据库名称core
,然后向数据库发出查询请求。
我也不能有多个适配器,因为所有客户都有自己的数据库,我必须从customer
!core_db
我以为我会在数据库名称前面加上表名。
我试过这个Module.php
:
"CategoryTableGateway" => function ($sm) {
$dbAdapter = $sm->get("Zend\Db\Adapter\Adapter");
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Category());
return new TableGateway("databasename.category", $dbAdapter, null, $resultSetPrototype);
}
我在我的配置默认数据库config\autoload\database.global.php
是这样的:
'db' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=core_db;host=localhost',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
)
我有一个例外,例如:
Base table or view not found: 1146 Table 'core_db.databasename.category' doesn't exist.
然后,我dbname=core_db
从config\autoload\database.global.php
.
现在,我遇到了另一个例外,例如:
SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected
那么我如何在 Zend Framework 2 中处理这种情况。我是 Zend Framework 2 的新手。
Edit
: 我自己解决了我的问题。
要连接到另一个模式的表,您需要传递TableIdentifier
而不是表!
例如,
代替:
$CategoryTableGateway = new TableGateway("category", $dbAdapter, null, $resultSetPrototype);
你所要做的:
$CategoryTableIdentifier = new TableIdentifier('category','dbname');
$CategoryTableGateway = new TableGateway($CategoryTableIdentifier, $dbAdapter, null, $resultSetPrototype);
希望它有效!