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

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

没有正确的解决方案

其他提示

这不是一个会产生有意义的水合的查询 Bird 对象,因为您只选择 species 列和这些物种的计数。所以 正如 Colin 建议的“原始”SQL 查询 可能是最好的方法 - 但最后不要水合,只需从结果中获取数据 PDOStatement.

如果 species 是对一个的引用 Species 表,你可以从那里开始工作:水合物 Species 对象,还有一个额外的列用于显示每个物种的鸟类数量。如果您使用 Symfony 1.2 版之前的版本,我强烈推荐 数据库查找器插件, ,因为它大大简化了使用 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单个文档(似乎没有成为它的API文档),所以我通常用在symfony的书的第八章的清单;但我不知道是否这是全面的。

但你可以做的是直接供给SQL来推进。下面是一个例子, http://propel.phpdb.org/改性文档/ user_guide /章节/ 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);

我不认为我曾经这样使用它自己,虽然我可能有。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top