【问题标题】:Zend framework group byZend 框架组
【发布时间】:2010-06-19 04:02:19
【问题描述】:

我正在尝试使用 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 工作台中运行查询,结果看起来正确。

我无法访问“column1”中的数据 - 我总是遇到此异常:

未捕获的异常 'Zend_Db_Table_Row_Exception' 带有消息'指定列“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 不知道如何处理它。

任何帮助表示赞赏。

【问题讨论】:

    标签: zend-framework zend-db


    【解决方案1】:

    首先,使用 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`
    

    【讨论】:

    • 我试过你的代码,我遇到了和以前一样的问题,尽管它对你有用。这让我觉得我的设置有问题。我正在使用 Zend Studio 7.2 进行开发。当我在 Zend Studio 中的 PHP 5.2.10 下运行您或我的代码时,我遇到了我概述的问题。当我在 PHP 5.3.0 下运行任一代码时,我都没有遇到任何问题。也许 PDO 现在在 PHP 5.2 下不能很好地工作?问题已解决 - 感谢大卫的帮助!
    • 我确实用 5.3 对其进行了测试,但我通常在 5.2 下工作。如果您将 MySQL 5.1 与 PHP 5.2 一起使用,则会出现一些 mysql.dll 问题,但它们通常会导致完全失败!
    • 检查 SQL 的好建议。我发现 Zend DB API 的经常会生成不符合您期望或可能合理需要的虚假 SQL(尤其是在多个涉及连接)。我从来没有遇到过任何其他 DB API 的问题,这是我认为 Zend 中唯一真正有问题的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2013-02-23
    • 2011-01-29
    • 2013-05-22
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多