Zend framework2 Zend Framework 2:使用适配器执行SQL查询

Zend framework2 Zend Framework 2:使用适配器执行SQL查询,zend-framework2,firebird,Zend Framework2,Firebird,我刚刚开始使用Zend框架,并开始了解它是如何工作的。我查阅了官方文档A,并遵循了一些教程,我发现的大多数示例都非常基本:应用程序中使用了一个或两个表(最多),并且为每个表创建了一个模型。这没有问题,但现在我正在一个实际的应用程序中工作,在这个应用程序中,我从一个复杂的sql查询中获取数据,该查询包括几个表(准确地说是5个表)和一个存储过程。老实说,我不知道该怎么做,甚至不知道从哪里开始尝试 我是否应该为查询中涉及的每个表(其中5个)创建一个模型,即使我只需要其中一些表中的1或2个字段,然后尝试

我刚刚开始使用Zend框架,并开始了解它是如何工作的。我查阅了官方文档A,并遵循了一些教程,我发现的大多数示例都非常基本:应用程序中使用了一个或两个表(最多),并且为每个表创建了一个模型。这没有问题,但现在我正在一个实际的应用程序中工作,在这个应用程序中,我从一个复杂的sql查询中获取数据,该查询包括几个表(准确地说是5个表)和一个存储过程。老实说,我不知道该怎么做,甚至不知道从哪里开始尝试

我是否应该为查询中涉及的每个表(其中5个)创建一个模型,即使我只需要其中一些表中的1或2个字段,然后尝试进行一次有效的选择?或 我是否应该在数据库上创建一个视图(对于存储过程来说听起来不是很好),然后基于该视图创建模型?或 我应该使用ORM让我的生活更轻松吗?如果是这样的话,你知道有哪一种可以与Firebird一起正常工作吗?还是我不知道,我应该做一些与我提到的完全不同的事情

更新

根据威尔的建议和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;
    }
结果是一个错误,如
从中的空值创建默认对象(控制器路径,行:$this->view->data=$results;)


似乎没有返回任何值。这是一种恰当的查询方式,还是我遗漏了什么?谢谢你的帮助

使用基于DoctrineORM的模块可以在这样的事情上提供很多帮助,但是有时候我更喜欢远离它们,以便从性能角度来简化我的应用程序。对于您列出的复杂sql查询,我通常只使用zf2附带的sql适配器

将以下use子句添加到类中:

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');

返回数据后,您将能够在$items数组上执行标准的foreach循环。

谢谢您的回答!我一直在尝试使它与适配器一起工作(也检查zend文档),但我不断收到一些错误,我不知道这是由于适配器配置还是查询。我得到的是一个
pdo异常
。要配置适配器,我使用配置文件global和local(正在工作)中的相同参数,然后在控制器中添加
use Zend\Db\adapter\adapter。我尝试了一个更简单的查询,但也没有成功。我遗漏了什么吗?你在使用pdo_mysql驱动程序吗?如果是这样的话,语法与我上面发布的略有不同。不,我使用的是pdo_firebird。我已经在
config/autoload
中的
global
local
文件中配置了一个适配器,它正在工作,所以我只是将相同的语法复制到控制器中。我想一定有办法调用该适配器,而不是再次声明它。但我认为问题不在于适配器,因为我得到的警告是从控制器中的空值创建默认对象。我用我正在使用的代码更新了上面的信息(我想我可能做得不太好),有什么想法吗?它现在可以工作了:D.我使用ResultInterface和ResultSet组件来处理查询产生的数据。但我仍然觉得,在控制器中以这种方式调用适配器并不舒服。。。您知道另一种方法吗?您必须对适配器进行di注入