2013-02-26 70 views
0

我剛開始使用Zend Framework並開始瞭解它如何工作。我檢查了官方文檔並遵循了幾個教程,我發現的大多數示例都非常基本:在應用程序中使用一個或兩個表(最多),併爲每個表創建一個模型。那裏沒問題,但現在我正在一個真正的應用程序中工作,從一個複雜的SQL查詢中獲取數據,其中包含多個表(準確地說5個)和一個存儲過程。我真的不知道如何繼續這個,甚至從哪裏開始嘗試。Zend Framework 2:使用適配器執行SQL查詢

我應該爲查詢中涉及的每個表創建一個模型(其中5個),甚至當我只需要其中一些字段的1或2個字段,然後嘗試使選擇工作?或 我應該在數據庫上創建一個視圖(對於存儲過程聽起來不太好),然後將該模型建立在該視圖上?或 我應該使用ORM讓我的生活更輕鬆嗎?如果是這樣,你知道任何與Firebird正常工作嗎?還是我不知道,我應該做一些完全不同於我提到的事情?

UPDATE

由Will的建議和Zend的文檔中的檢查,我決定使用適配器直接在SQL格式的查詢,但它不太工作呢。我至今在我的控制器是這樣的:

use Zend\Db\Adapter\Adapter as DbAdapter; 
use Zend\Db\ResultSet\ResultSet; 

...

public function indexAction() { 
    $db = new DbAdapter(array(
    'driver'   => 'Pdo', 
    'dsn'   => 'firebird:host=127.0.0.1;port=3050;dbname=C:\\wamp\\www\\Reports\\data\\THdata.GDB', 
    'username' => 'SYSDBA', 
    'password' => 'masterkey'));  

    $sql = 'SELECT SELITE FROM TILIKAUSI WHERE COMPANYID = 1'; //I am starting with a simple query first.  
    $sql_result = $db->createStatement($sql, array(125000, 125200))->execute(); 
    if($sql_result->count() > 0){ 
    $results = new ResultSet(); 
    $this->view->data = $results->initialize($sql_result)->toArray(); 
    } 
    return $this->view; 
    } 

結果是像Creating default object from empty value in (Controller path, line: $this->view->data = $results;)

錯誤好像返回沒有值。這是一個適當的方式做這個查詢或我錯過了什麼?謝謝你的幫助!

回答

1

使用基於DoctrineORM的模塊可以幫助解決諸如此類的問題,但有時我更願意遠離它們來更精簡我的應用程序性能。對於像你列出的那樣複雜的SQL查詢,我通常只使用zf2附帶的SQL適配器。

以下使用條款添加到您的類:

use Zend\Db\Adapter\Adapter; 

一個例子是這樣的:

$adapter = new Adapter(array('driver' => 'mysqli', 
'host' => 'localhost', 
'port' => '3306', 
'dbname' => 'test', 
'username' => 'test', 
'password' => 'test')); 
$list = $adapter->getDriver()->getConnection()->execute('Add your complex query as you currently have it'); 

當返回的數據,您將能夠在做一個標準的foreach循環$ items數組。

+0

感謝您的回答!我一直試圖使它適用於適配器(也檢查zend文檔),但我不斷收到一些錯誤,我不知道這是由於適配器配置還是查詢。我得到的是一個'PDOException'。爲了配置適配器,我使用了我在配置文件全局和本地(正在工作)中使用的相同參數,然後在我的控制器中添加'use Zend \ Db \ Adapter \ Adapter;'。我嘗試了一個更簡單的查詢,但也不支持。我錯過了什麼嗎? – Clarissa 2013-02-27 09:21:14

+0

您使用的是pdo_mysql驅動程序嗎?如果是這樣的話,語法與我上面發佈的語法稍有不同。 – 2013-02-27 19:05:24

+0

不,我正在使用pdo_firebird。我已經在config/autoload中的'global'和'local'文件中配置了一個適配器,它正在工作,所以我只是將相同的語法複製到控制器中。我想必須有一種方法來調用該適配器,而不是再次聲明它。但我不認爲問題是適配器,因爲我得到的警告是'在控制器中從空值創建默認對象'。我使用我正在使用的代碼更新了上面的信息(我想我可能沒有做到這一點),有什麼想法? – Clarissa 2013-02-28 08:57:06