在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"
答案 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);