Symfony で Propel ORM を使用して group by 句を含む SQL カウントを記述するにはどうすればよいですか?
質問
Propel ORM を使用して次の SQL クエリを作成するにはどうすればよいですか?
SELECT species, COUNT(*) FROM Bird GROUP BY species;
正しい解決策はありません
他のヒント
これは意味のあるハイドレートをもたらすクエリではありません。 Bird
オブジェクトを選択するだけなので、 species
列とそれらの種の数。それで コリンが提案した「生の」SQL クエリ おそらくここに行くのが最善の方法でしょう - ただし、最後にハイドレートせず、結果からデータを取得するだけです。 PDOStatement
.
もし species
への参照でした Species
テーブルがあるので、そこから作業できます。水分補給する Species
オブジェクト。種ごとの鳥の数を示す追加の列があります。バージョン 1.2 までの Symfony を使用している場合は、以下を強くお勧めします。 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 にアップグレードする必要があります。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ブックの第8章にリストを使用します。しかし、私はそれが包括的だかどうかさっぱりだが。
しかし、あなたにできることは推進するために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);
私は私が持っているかもしれませんが、私が今までこのよう自分自身にそれを使用していたとは思いません。