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

Zend framework2 zf2在两个不同的数据库之间建立连接,zend-framework2,zend-db,zend-db-table,Zend Framework2,Zend Db,Zend Db Table,我正在尝试使用Zend Framework 2在放置在不同数据库中的两个表之间建立连接 第一个表称为users,存储在数据库admin 第二个表称为层次结构,存储在数据库客户 我在global.php中加载数据库适配器 )) 但是,当我尝试使用此函数加入UserDao时: 这将生成以下SQL语句: 选择“用户”。*,“h”。“id”作为“层次id”,“h”。“级别”作为“级别”,从“用户”内部将“层次结构”作为“h”连接到“h”。“id”=“用户”。“idHierarchy”其中“级别”=“1”

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

第一个表称为users,存储在数据库admin

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

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

))

但是,当我尝试使用此函数加入UserDao时:

这将生成以下SQL语句:

选择“用户”。*,“h”。“id”作为“层次id”,“h”。“级别”作为“级别”,从“用户”内部将“层次结构”作为“h”连接到“h”。“id”=“用户”。“idHierarchy”其中“级别”=“1”

但当我尝试使用它时,它会抛出此异常:

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

$select->join(数组('h'=>'customer.hierarchys'),'h.id=users.idHierarchy',数组('hierarchyId'=>'id','level'=>'level')

但它也抛出了这个例外:

SQLSTATE[42S02]:未找到基表或视图:1146表“admin.customer.hierarchys”不存在

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

谁能帮帮我吗?求你了


谢谢

框架不支持与其他数据库的联接。您必须使用纯SQL来构建查询。

问题的出现是因为Select类转义引号的方式

$select->join(“database2.table2”,“database2.table2.id=table.id”)

呈现为:

从'database2'上的'table'内部联接'database2.table2'。'table2'。'id'='table'。'id'

请注意“database2.table2”周围不一致和不正确的引用

更新\Zend\Db\Sql\Select中的第596、599、624、625行以将“quoteIdentifier”方法替换为“quoteIdentifier Infragment”将正确呈现查询并允许执行跨数据库联接

我已经向Zend提交了一份问题报告,因为我不相信当前的行为是有意的,所以希望它能在未来的构建中更新。目前,手动更新类是很容易的(尽管承认有点脏)


这个问题似乎是前一段时间提出的,但我似乎找到了一个很好的解决方法。如果您使用Zend\Db\Sql\TableIdentifier和Zend\Db\Sq\表达式,您将能够绕过您的问题

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;
}

我不确定您的Hierarchys表在哪个数据库中,所以现在我使用了“admin”。您可以将其替换为您拥有的任何数据库名称。看看它是否适合您,似乎适合我。

正如Dan所回答的,但是对于Zend 2.3您应该更改文件Zend\Db\Sql\Select.php中的第742行

$joinName = $platform->quoteIdentifier($joinName);
$name = $platform->quoteIdentifier($name);

和第680行

$joinName = $platform->quoteIdentifier($joinName);
$name = $platform->quoteIdentifier($name);



Obs:这些只是我能识别的行,可能不是一个完整的列表。

为什么要使用DAO概念?只有在表网关中,您才能拥有所需的所有内容。您在global或local.php中已经有了适配器。你们已经有了制造桌面网关的工厂,是吗?为什么需要将层次结构类(我认为它是另一个表网关)传递给当前类?要进行所需的连接,唯一需要的是表标识符

$table2 = new Zend\Db\Sql\TableIdentifier('table2', 'schema_name'); 
$select = $this->tableGateway->getSql()->select()
->join($table2, 'table1.field = table2.field', ['fields_from_table2'], 'INNER');

$sql = new Sql($this->tableGateway->getAdapter());
$selectString = $sql->buildSqlString($select);
$result = $adapter->query($selectString, $adapter::QUERY_MODE_EXECUTE);

$name = $platform->quoteIdentifier($name);
$name = $platform->quoteIdentifierInFragment($name);
$table2 = new Zend\Db\Sql\TableIdentifier('table2', 'schema_name'); 
$select = $this->tableGateway->getSql()->select()
->join($table2, 'table1.field = table2.field', ['fields_from_table2'], 'INNER');

$sql = new Sql($this->tableGateway->getAdapter());
$selectString = $sql->buildSqlString($select);
$result = $adapter->query($selectString, $adapter::QUERY_MODE_EXECUTE);