zend-framework2 - zf2 在两个不同的数据库之间建立连接

标签 zend-framework2 zend-db zend-db-table

我正在尝试使用 Zend Framework 2 在放置在不同数据库中的两个表之间建立连接。

第一个表名为 用户 并存储在数据库中 管理员

第二个表被称为 层次结构并存储在数据库中 客户

我在 global.php 中加载数据库适配器

return array(
'admin' => array(
    'driver' => 'Pdo',
    'dsn' => 'mysql:dbname=admin;host=localhost',
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    ),
),
'customer' => array(
    'driver' => 'Pdo',
    'dsn' => 'mysql:dbname=customer;host=localhost',
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    ),
),
'service_manager' => array(
    'factories' => array(
        'Zend\Db\Adapter\Adapter'
        => 'Zend\Db\Adapter\AdapterServiceFactory',
    ),
),

);



但是当我尝试使用此功能加入 UserDao 时:

public function getSelect(Hierarchy $hierarchy) {
    $select = $this->tableGateway->getSql()->select();
    $select->where(array('level' => $hierarchy()->getId()));
    $select->join(array('h' => 'hierarchies'), 'h.id = users.idHierarchy', array('hierarchyId' => 'id', 'level' => 'level'));
    return $select;
}


这将生成此 SQL 语句:

SELECT "users".*, "h"."id" AS "hierarchyId", "h"."level" AS "level" FROM "users" INNER JOIN "hierarchies" AS "h" ON "h"."id" = "users"."idHierarchy" WHERE "level" = '1'



但是当我尝试使用它时它会抛出这个异常:

Zend\Db\Adapter\Exception\InvalidQueryException
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'admin.hierarchies' doesn't exist


我尝试在连接中指示数据库的名称,如下所示:

$select->join(array('h' => 'customer.hierarchies'), 'h.id = users.idHierarchy', array('hierarchyId' => 'id', 'level' => 'level'));



但它也会抛出这个异常:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'admin.customer.hierarchies' doesn't exist



我发现这个网站解释了我如何做到这一点,但它只对 Zend Framework 1 有效,我正在使用 Zend Framework 2。

Using Different Databases with Zend Framework

有人可以帮助我吗?请。

谢谢!

最佳答案

看起来这个问题是不久前被问到的,但我似乎找到了一个很好的解决方法或解决方案。如果您使用 Zend\Db\Sql\TableIdentifier 和 Zend\Db\Sq\Expression,您将能够解决您的问题。

public function getSelect(Hierarchy $hierarchy) {
    $select = $this->tableGateway->getSql()->select();
    $select->where(array('level' => $hierarchy()->getId()));
    $select->join(
         array('h' => new TableIdentifier('hierarchies', 'admin')), 
         new Expression('h.id = ?', 'users.idHierarchy', Expression::TYPE_IDENTIFIER), 
         array('hierarchyId' => 'id', 'level' => 'level')
    );
    return $select;
}

我不确定您的层次结构表在哪个数据库中,所以我现在使用“admin”。您可以将其替换为您拥有的任何数据库名称。看看它是否对你有用,对我来说似乎很好用。

关于zend-framework2 - zf2 在两个不同的数据库之间建立连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15830774/

相关文章:

php - ServiceLocatorAwareInterface 在运行模块测试时混淆 DI 容器

php - 如何扩展 ZF2 骨架应用程序 - 带外键的实体

php - zf2如何上传文件,多于1个文件

php - 解释这个 Zend_Select and Convert to SQL Query?

zend-framework - 迭代行集时内存不足

php - zend 新手问题 - "No adapter found for "

javascript - 通过 Controller 操作 zf2 附加 javascript

mysql - Zend Db Sql 在哪里

mysql - 扩展Zend_Db_Table_Abstract创建联接时,会崩溃MySQL

php - 使用 ResultSet Zend Framework 2 的Where 条件执行查询?