【问题标题】:Fetch values of aggregated columns in Propel在 Propel 中获取聚合列的值
【发布时间】:2011-12-03 22:58:28
【问题描述】:

我正在尝试在 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:如果重要的话,我说的是带有 Propel 的 symfony 1.4。

【问题讨论】:

    标签: symfony1 propel symfony-1.4


    【解决方案1】:

    您应该避免使用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'))
    

    【讨论】:

      【解决方案2】:

      当我采用同样的方法时,我使用这个 sn-p 来检索和获取数据,但是在我的 criteriaaddSelectColumn 中只选择了一列:

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

      希望对你有帮助。

      【讨论】:

        【解决方案3】:

        我的方法是进行查询并遍历记录集。正如建议的那样,我使用 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-09
          • 2010-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多