我正在尝试使用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;
TableClass扩展了'Zend_Db_Table_Abstract'。
我可以通过查看mysql查询日志来查看查询。查询格式正确 - 在查询中命名了column1,如果我在mysql workbench中运行查询,结果看起来是正确的。
我无法访问'column1'中的数据 - 我总是遇到这个例外:
未捕获的异常'Zend_Db_Table_Row_Exception',消息'Specified column“column1”不在行'
但我可以毫无问题地访问日期列。
我试过了:
按数组索引访问列: $结果[0] 但是你得到一个例外(不能通过索引访问列)。
不使用列别名: $ select-> from(“table”,array(“date”,“sum(column1)”)); $ column1 = $ result [“sum(column1)”]; 但是你得到一个例外(没有这样的列“sum(column1)”)。
投入Zend_Db_Expr: “column1”=> new Zend_Db_Expr(“sum(column1)”) 但这没有用。
我见过的其他一些例子建议使用没有聚合函数的列名,即。 “column1”而不是“sum(column1)”,但在我看来并不是答案 - 查询中没有任何聚合函数,因此mysql不知道如何处理它。
任何帮助表示感谢。
答案 0 :(得分:8)
首先,使用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
或者只是
die($select); //print SQL
我使用您的示例编写了以下测试脚本,并且没有问题:
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;
使用Zend_Debug :: dump($ result);如有必要,检查Zend_Db_Table_Row中的数据。
在我的例子中,生成的SQL如下:
SELECT `table`.`date`, sum(column1) AS `column1` FROM `table` GROUP BY `date`