如何使用Propel ORM編寫以下SQL查詢?如何使用Symfony中的Propel ORM使用group by子句編寫SQL計數?
SELECT species, COUNT(*) FROM Bird GROUP BY species;
如何使用Propel ORM編寫以下SQL查詢?如何使用Symfony中的Propel ORM使用group by子句編寫SQL計數?
SELECT species, COUNT(*) FROM Bird GROUP BY species;
我發現它很難找到標準的Propel單個文檔(似乎沒有成爲它的API文檔),所以我通常用在symfony的書的第八章的清單;但我不知道這是否全面。
但您可以做的是直接將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);
我,我曾經這樣使用它自己,雖然我可能不覺得做。
$c = new Criteria(); $c->addAsColumn('cnt', "count(*)"); self::addSelectColumns($c); $c->addGroupByColumn(BirdPeer::SPECIES);
但溜溜需要做定製的保溼,如果你需要得到COUNT(*),以您的填充物。
這不是一個查詢會導致有意義的水合Bird
對象,因爲您只選擇species
列和這些物種的計數。所以a "raw" SQL query as Colin suggested可能是最好的方式去這裏 - 但最後不要保溼,只需從得到的PDOStatement
獲得數據。
如果species
是一個Species
表的引用,你可以從那裏工作:水合物Species
對象,以每種鳥類計數一個額外的列。如果您使用的Symfony高達1.2版本,我強烈建議DbFinder plugin,因爲它大大簡化了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çoisZaniotto移植了其大部分功能並增加了更多功能,因此上述代碼在Propel 1.5中無需額外插件。
我該如何運行此標準,以及如何進行自定義保溼? – NobleUplift 2013-11-15 18:22:53