2013-02-26 73 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