如何使用 Propel ORM 编写以下 SQL 查询?
SELECT species, COUNT(*) FROM Bird GROUP BY species;
这不是一个会产生有意义的水合Bird
对象的查询,因为您只选择了species
这些物种的列和计数。因此,Colin 建议的“原始”SQL 查询可能是最好的方法 - 但最后不要水合,只需从结果中获取数据PDOStatement
。
如果species
是对Species
表格的引用,您可以从那里开始工作:水合物Species
对象,每个物种的鸟类数量都有一个额外的列。如果您使用 Symfony 1.2 及以下版本,我强烈推荐DbFinder 插件,因为它极大地简化了使用Criteria
,并且具有选择单个补充列的方法:
$speciesQuery = DbFinder::from('Species')->
join('Bird')->
groupBy('Bird.Id')->
withColumn('COUNT(Bird.Id)', 'NbBirds');
foreach ($speciesQuery->find() as $species) {
echo $species->getName() . ": " . $species->getNbBirds() . " birds\n";
}
如果您使用 Symfony 1.3 或 1.4,您应该将捆绑的 Propel 1.4 升级到 Propel 1.5,其中 DbFinder 的创建者 François Zaniotto 移植了它的大部分功能并添加了更多功能,因此上述代码可以在 Propel 1.5 中运行而无需额外的插件。
$c = new Criteria(); $c->addAsColumn('cnt', "count(*)"); self::addSelectColumns($c); $c->addGroupByColumn(BirdPeer::SPECIES);
但是,如果您需要将 count(*) 获取到填充的对象,则您需要进行自定义补水。
我发现很难找到关于 Propel Criteria 的单个文档(上面似乎没有 API 文档),所以我通常使用 symfony 书第 8 章中的列表;但我不知道这是否全面。
但是你可以做的是直接将 SQL 提供给 Propel。以下是从http://propel.phpdb.org/docs/user_guide/chapters/FindingObjects.html中的示例修改的:
$con = Propel::getConnection(DATABASE_NAME);
// if not using a driver that supports sub-selects
// you must do a cross join (left join w/ NULL)
$sql = "SELECT species, COUNT(*) FROM Bird GROUP BY species";
$stmt = $con->createStatement();
$rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_NUM);
return parent::populateObjects($rs);
我认为我自己从来没有这样使用过它,尽管我可能有。