Это не запрос, который приведет к значимым гидратированным Bird
объектам, так как вы выбираете только столбец species
и количество этих видов. Так что «сырой» 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, перенес большую часть его функциональности и добавил больше, поэтому приведенный выше код работает в Propel 1.5 без дополнительных плагин.