在Propel中获取聚合列的值

时间:2011-12-03 22:58:29

标签: symfony1 propel symfony-1.4

我正在尝试在Propel中进行以下查询:

$criteria = new Criteria();
$criteria->clearSelectColumns();
$criteria->addSelectColumn(TableName::COLUMN1)
    ->addSelectColumn(TableName::COLUMN2)
    ->addAsColumn('alias1', 'DATE('.TableName::INIT_TIME.')')
    ->addAsColumn('alias2', 'COUNT('.TableName::DOWNLOAD_START_TIME.')')
    ->addGroupByColumn('DATE('.TableName::INIT_TIME.')')
    ->addGroupByColumn(TableName::DOWNLOAD_START_TIME);

$logs = TableName::doSelect($criteria);
看来一切正常并根据MySQL日志文件查询生成并保存到服务器右侧。但是我无法获得聚合列的值。

doSelect返回TableName对象的数组,这些对象没有获取聚合列的方法。那么,我该怎么做呢?

PS:如果重要的话,我正在谈论symfony 1.4和Propel。

3 个答案:

答案 0 :(得分:3)

您应该避免使用Criteria,而是使用ModelCriteria API(文档位于:http://www.propelorm.org/reference/model-criteria.html

以下查询:

<?php

$criteria = new Criteria();
$criteria->clearSelectColumns();
$criteria->addSelectColumn(TableName::COLUMN1)
    ->addSelectColumn(TableName::COLUMN2)
    ->addAsColumn('alias1', 'DATE('.TableName::INIT_TIME.')')
    ->addAsColumn('alias2', 'COUNT('.TableName::DOWNLOAD_START_TIME.')')
    ->addGroupByColumn('DATE('.TableName::INIT_TIME.')')
    ->addGroupByColumn(TableName::DOWNLOAD_START_TIME);

$logs = TableName::doSelect($criteria);

可以改写如下:

$query = TableNameQuery::create()
    ->select(array('Column1', 'Column2'))
    ->withColumn('DATE(InitTime)', 'alias1')
    ->withColumn('COUNT(DownloadStartTime)', 'alias2')
    ->groupBy('alias1')
    ->groupByDownloadStartTime()
    ;
$logs = $query->find();

请注意,您不会同时选择alias1alias2列,因为您没有将它们添加到代码中的所选列中。您可以通过在select()子句中添加两个别名来完成此操作:

    ->select(array('Column1', 'Column2', 'alias1', 'alias2'))

答案 1 :(得分:1)

我在使用此相同方法时使用此代码段来检索和获取数据,但在criteriaaddSelectColumn中只选择了一列:

$logs = TableName::doSelectStmt($criteria); 
$data = $logs->fetchAll(PDO::FETCH_COLUMN, 0);

我希望这可以帮到你。

答案 2 :(得分:0)

我的方法是进行查询并遍历记录集。建议我使用FETCH_BOTH来获取数组位置,但也可以使用名称。我将这些值和水合我的对象,但也手动填充要保存聚合值的对象的属性。我将这些对象传递回我的应用程序并使用它们,因为在我的视图中将使用普通对象。

        $stmt = self::doSelectStmt($c);

        // empty array for now
        $results = array();
        // lets iterate through this
        while($row = $stmt->fetch(PDO::FETCH_BOTH)) {
           // we need to create a new object
           $division = new Division();
           // and we'll hydrate each row turning into an object so we can use it easily
           $division->hydrate($row);
           // now here's the magic, this object did not exist from our tables, we'll fix that
           $division->setNumPlayers($row['num_players']);
           $division->setNumTeams($row['teams']);
           // set the output object
           $results[] = $division;
           } 
return $results; // array of objects including aggregate values