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

时间:2016-04-19 15:12:41

标签: 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 [...]

这导致错误的引用"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"

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这对我有用。也应该适合你。你必须使用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;

答案 2 :(得分:0)

如果注册了实际zend db适配器的mysql用户有权从另一个架构中获取数据,则只需要做的就是添加一个具有架构定义的表标识符,如下所示:

$xyzTable = new Zend\Db\Sql\TableIdentifier('table_name', 'schema_name'); // table2
$select = $this->tableGateway->getSql()->select()
->join($xyzTable, '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);

此问题的主题与zf2 make a join between two different databases