2013-04-05 65 views
4

我想使放置在不同的数据库与Zend框架2.ZF2使两个不同的数据库

第一个表被称为用户两个表之间的连接,并存储在数据库中管理之间的连接

第二个表被称为层次,并存储在数据库中客户

我加载databas在global.php ES适配器

return array(
'admin' => array(
    'driver' => 'Pdo', 
    'dsn' => 'mysql:dbname=admin;host=localhost', 
    'driver_options' => array(
     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
    ), 
), 
'customer' => array(
    'driver' => 'Pdo', 
    'dsn' => 'mysql:dbname=customer;host=localhost', 
    'driver_options' => array(
     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
    ), 
), 
'service_manager' => array(
    'factories' => array(
     'Zend\Db\Adapter\Adapter' 
     => 'Zend\Db\Adapter\AdapterServiceFactory', 
    ), 
), 

);

但是,当我试图在userDAO的联接使用此项功能:

public function getSelect(Hierarchy $hierarchy) { 
    $select = $this->tableGateway->getSql()->select(); 
    $select->where(array('level' => $hierarchy()->getId())); 
    $select->join(array('h' => 'hierarchies'), 'h.id = users.idHierarchy', array('hierarchyId' => 'id', 'level' => 'level')); 
    return $select; 
} 

这产生这样的SQL语句:

选择 “用户” * “h”。“id”AS“hierarchyId”,“h”。“level”AS“level”FROM“users”INNER JOIN“hierarchy”AS“h”ON“h”。“id”=“users” idHierarchy“WHERE”level“='1'

但是当我尝试使用它,它抛出这个异常:

Zend\Db\Adapter\Exception\InvalidQueryException 
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'admin.hierarchies' doesn't exist 

我试图表明数据库的int加入这样的名字:

$ select-> join(array('h'=>'customer.hierarchies'),'h.id = users.idHierarchy',array('hierarchyId'=>'id','level'=>'level')) ;

但它太引发此异常:

SQLSTATE [42S02]:基表或视图未找到:1146表 'admin.customer.hierarchies' 不存在

我发现这个网站在哪里解释了我可以做到这一点,但它只适用于Zend Framework 1和我正在使用Zend Framework 2.

Using Different Databases with Zend Framework

有人能帮助我吗?请。

谢谢!

回答

0

该框架不支持与另一个数据库的连接。您必须使用普通的SQL来构建查询。

0

由于Select类转义引号的方式而发生此问题。

$选择 - >加入( “database2.table2”, “database2.table2.id = table.id”)

呈现为:

选择 '表' *“database2.table2 '。'FROM'table'INNER JOIN'database2.table2'ON'database2'。'table2'。'id'='table'。'id'

注意“database2.table2” 。

更新\ Zend \ Db \ Sql \ Select中的第596,599,624,625行以用“quoteIdentifierInFragment”替换“quoteIdentifier”方法正确呈现查询并允许执行跨数据库联接。

我已经向Zend提交了一个问题报告,因为我不相信目前的行为是希望在将来的版本中更新。现在,它很容易(虽然承认有点肮脏)手动更新类。

https://github.com/zendframework/zf2/issues/4307

3

貌似这个问题被问了一段时间回来,但我似乎找到了一个好办法或解决方案。如果您使用Zend \ Db \ Sql \ TableIdentifier和Zend \ Db \ Sq \ Expression,您将能够解决您的问题。

public function getSelect(Hierarchy $hierarchy) { 
    $select = $this->tableGateway->getSql()->select(); 
    $select->where(array('level' => $hierarchy()->getId())); 
    $select->join(
     array('h' => new TableIdentifier('hierarchies', 'admin')), 
     new Expression('h.id = ?', 'users.idHierarchy', Expression::TYPE_IDENTIFIER), 
     array('hierarchyId' => 'id', 'level' => 'level') 
    ); 
    return $select; 
} 

我不确定您的层次结构表所在的数据库,所以我现在使用'admin'。 YOu可以用你拥有的任何数据库名称替换它。看看它是否适合你,似乎对我很好。

0

正如丹回答,但对于的Zend 2.3你应该改变线742文件Zend的\ DB \ SQL \ Select.php

$joinName = $platform->quoteIdentifier($joinName); 

$joinName = $platform->quoteIdentifierInFragment($joinName); 

and line 680 from

$name = $platform->quoteIdentifier($name); 

$name = $platform->quoteIdentifierInFragment($name); 


观测数据:这是唯一我能确定,并可能不是一个完整列表线。

相关问题