我们正在创建一个使用Zend Framework 2和多个数据库的Web应用程序。我有一个core
数据库,可以加载所有客户的信息。此数据库包含customer
表。客户表的字段是 ::
- 编号
- 用户名
- 密码
- database_name
- customer_name
- ...................
当客户登录时,我必须从core
数据库中加载他的数据库名称,然后向数据库发出查询请求。
也不能有多个适配器,因为所有客户都有自己的数据库,我必须从core_db
表中加载customer
!
我以为我会在数据库名称前面加上表名。
我在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.
然后,我从config'autoload'database.global.php
中删除了dbname=core_db
.
现在,我得到了另一个例外,例如:
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);
希望它有效!
当客户登录时,我必须从核心数据库加载他的数据库名称,然后向数据库发出查询请求。
这就是你做错了什么。
只需将所有内容保存在单个数据库中,就像世界上非常电子商务的网站一样。