我正在尝试在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。
答案 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();
请注意,您不会同时选择alias1
和alias2
列,因为您没有将它们添加到代码中的所选列中。您可以通过在select()
子句中添加两个别名来完成此操作:
->select(array('Column1', 'Column2', 'alias1', 'alias2'))
答案 1 :(得分:1)
我在使用此相同方法时使用此代码段来检索和获取数据,但在criteria
到addSelectColumn
中只选择了一列:
$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