Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend Framework 2-连接不同数据库和模式中的表_Php_Database_Zend Framework2 - Fatal编程技术网

Php Zend Framework 2-连接不同数据库和模式中的表

Php Zend Framework 2-连接不同数据库和模式中的表,php,database,zend-framework2,Php,Database,Zend Framework2,在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 [...] 这会导致错误的引用“databa

在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 server中)


所需的结果是
“database2”、“dbo”、“table2”

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

在表网关类的方法中,可以执行以下操作:

$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\u database.database.table


这个问题的主题相同

谢谢你的回答,但是,据我所知,你不能从两个不同的适配器连接两个表,或者我错了?