我刚刚开始使用Zend框架,并开始了解它是如何工作的。我已经检查了官方文档,并遵循了几个教程,我发现的大多数示例都非常基本:在应用程序中使用一个或两个表(最多),并为每个表创建一个模型。这没有问题,但是现在我正在一个实际的应用程序中工作,我从一个复杂的sql查询中获取数据,该查询包括几个表(准确地说是5个)和一个存储过程。老实说,我不知道如何继续下去,甚至从哪里开始尝试。
我是否应该为查询中涉及的每个表(其中5个)创建一个模型,即使我只需要其中一些表中的1或2个字段,然后尝试进行选择?或我是否应该在数据库上创建一个视图(对于存储过程来说听起来不太好),然后将模型建立在该视图上?或我是否应该使用ORM来简化我的工作?如果有,你知道有什么可以和火鸟一起工作的吗?还是我不知道,我应该做一些完全不同于我提到的事情?
根据Will的建议和检查Zend的文档,我决定使用适配器直接以SQL格式进行查询,但它还没有完全工作。到目前为止,我在控制器中所拥有的是:
use ZendDbAdapterAdapter as DbAdapter;
use ZendDbResultSetResultSet;
…
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;)
似乎没有返回任何值。这是一个适当的方式做这个查询还是我错过了什么?谢谢你的帮助!
使用基于DoctrineORM的模块可以帮助解决很多这样的问题,但是有时我宁愿远离它们,以便更有效地简化我的应用程序。对于像您列出的那样复杂的sql查询,我通常只使用zf2附带的sql适配器。
将下面的use子句添加到你的类中:
use ZendDbAdapterAdapter;
一个例子是这样的:
$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循环。