Php Zend Framework 2-连接不同数据库和模式中的表
在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\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
这个问题的主题相同谢谢你的回答,但是,据我所知,你不能从两个不同的适配器连接两个表,或者我错了?