3

如何使用 Propel ORM 编写以下 SQL 查询?

SELECT species, COUNT(*) FROM Bird GROUP BY species;
4

3 回答 3

2

这不是一个会产生有意义的水合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 中运行而无需额外的插件。

于 2010-05-17T08:14:08.327 回答
1
$c = new Criteria();
$c->addAsColumn('cnt', "count(*)");
self::addSelectColumns($c);
$c->addGroupByColumn(BirdPeer::SPECIES);

但是,如果您需要将 count(*) 获取到填充的对象,则您需要进行自定义补水。

于 2009-06-04T13:02:53.090 回答
0

我发现很难找到关于 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);

我认为我自己从来没有这样使用过它,尽管我可能有。

于 2009-06-01T15:57:43.067 回答