Zend框架组由

7 zend-framework zend-db

我正在尝试使用Zend框架做一组.这是我的代码:

$table = new TableClass();
$select = $table->select();
$select->from ("table", array("date", "column1" => "sum(column1)"));
$select->group ( array ("date") );
$results = $table->fetchAll ($select);
$result = $results[0];
$date = $result->date;
$column1 = $result->column1;
Run Code Online (Sandbox Code Playgroud)

TableClass扩展了'Zend_Db_Table_Abstract'.

我可以通过查看mysql查询日志来查看查询.查询格式正确 - 在查询中命名了column1,如果我在mysql workbench中运行查询,结果看起来是正确的.

我无法访问'column1'中的数据 - 我总是遇到这个异常:

未捕获的异常'Zend_Db_Table_Row_Exception',消息'Specified column"column1"不在行中'

但是,我可以毫无问题地访问日期列.

我试过了:

  • 通过数组索引访问列:$ result [0]但是你得到一个异常(不能通过索引访问列).

  • 不使用列别名:$ select-> from("table",array("date","sum(column1)")); $ column1 = $ result ["sum(column1)"]; 但是你得到一个例外(没有这样的列"sum(column1)").

  • 抛出Zend_Db_Expr:"column1"=> new Zend_Db_Expr("sum(column1)")但这没有帮助.

我见过的其他一些例子建议使用没有聚合函数的列名,即.而不是"总和(列1)","列1",但似乎并没有给我的答案 - 查询不具有任何聚合函数所以MySQL将不知道该怎么用它做.

任何帮助赞赏.

Dav*_*unt 9

首先,使用Zend_Db_Select(以及扩展名Zend_Db_Table_Select)的快速提示,您可以通过调用toString方法来查看生成的SQL.在使用结果集之前验证代码是否生成正确的查询至关重要:

$select = $table->select();
$select->from ("table", array("date", "column1" => "sum(column1)"));
$select->group ( array ("date") );

$sql = (string) $select; //Retrieve SQL as a string
Run Code Online (Sandbox Code Playgroud)

或者干脆

die($select); //print SQL
Run Code Online (Sandbox Code Playgroud)

我使用您的示例编写了以下测试脚本,没有任何问题:

class Table extends Zend_Db_Table_Abstract 
{
    protected $_primary = 'id';
    protected $_name = 'table';
}

$db = Zend_Db::factory('Pdo_Mysql', array(
    'dbname' => 'test',
    'username' => 'root',
    'password' => '',
    'host' => 'localhost'
));

$table = new Table($db);

$select = $table->select();
$select->from ($table, array("date", "column1" => new Zend_Db_Expr("sum(column1)")));
$select->group ( array ("date") );
$sql = (string) $select;

echo $sql;

$results = $table->fetchAll ($select);
$result = $results[0];
$date = $result->date;
$column1 = $result->column1;

echo '<br>' . $date . ': ' . $column1;
Run Code Online (Sandbox Code Playgroud)

使用Zend_Debug :: dump($ result); 如有必要,检查Zend_Db_Table_Row中的数据.

在我的例子中,生成的SQL如下:

SELECT `table`.`date`, sum(column1) AS `column1` FROM `table` GROUP BY `date`
Run Code Online (Sandbox Code Playgroud)