PHP - 在 Zend 框架 2 中处理多个数据库的最佳方式


PHP - Best Way To Handle Multiple database in Zend framework 2

我们正在创建一个使用Zend Framework 2和多个数据库的Web应用程序。我有一个core数据库,可以加载所有客户的信息。此数据库包含customer表。客户表的字段是 ::

  1. 编号
  2. 用户名
  3. 密码
  4. database_name
  5. customer_name
  6. ...................

当客户登录时,我必须从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);

希望它有效!

当客户登录时,我必须从核心数据库加载他的数据库名称,然后向数据库发出查询请求。

这就是你做错了什么。

只需将所有内容保存在单个数据库中,就像世界上非常电子商务的网站一样。