2013-04-05 142 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); 


觀測數據:這是唯一我能確定,並可能不是一個完整列表線。

相關問題