ZendFramework2-连接不同数据库和模式中的表


Zend Framework 2 - Join tables in different databases and schemas

在Zend Framework 2中,当我想在不同的数据库表之间进行连接时,我必须使用'Zend'Db'Sql'TableIdentifier类来避免错误的转义。

如果我这样做:

$select->join(['B' => 'database2.table2'], 'A.id = B.id');

它被呈现为:

SELECT [..] FROM "table" as "A" INNER JOIN "database2.table2" ON [...]

这导致引用"database2.table2" 不正确

为了解决这种情况,我可以做:

$tbl2 = new 'Zend'Db'Sql'TableIdentifier('table2', 'database2');
$select->join(['B' => $tbl2], 'A.id = B.id');

这样报价是正确的"database2"."table2"

但是,如果我必须指定数据库和模式,我该怎么办呢?(例如在ms-sql服务器中)

所需结果为"database2"."dbo"."table2"

当您使用表网关类的方法时,可以执行以下操作:

$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);

如果你试图从字面上写database.table,你不会让Zend知道database.table就是它。因此,Zend会把当前定义的数据库放在Module.php中当前表网关工厂使用的适配器中,写current_database.database.table

这个问题的主题与zf2在两个不同的数据库之间进行连接相同

架构是在Zend''Db''Adapter''Adapter('database'=>'schemaname')中指定的。我认为您不能通过查询来更改模式。您必须使用不同的适配器。

这对我有效。也应该对你有效。您必须将其与tableGateway 一起使用

use use Zend'Db'Sql'Select;
use Zend'Db'Sql'Where;
$someCondition=new Where();
$someCondition->equalTo('columnName',$columnValue);
//you can build $this->tableGateway from your DB adapter
$rowset = $this->tableGateway->select(function (Select $select) use ($someCondition) {
        $table2forInnerJoin = new 'Zend'Db'Sql'TableIdentifier('table2Name', 'table2Database');
        $select->join(array('table2Name'=>$table2forInnerJoin),"table1Name.id = table2Name.id");
        $select->where($someCondition);
});
return $rowset;