Propel ORM を使用して次の SQL クエリを作成するにはどうすればよいですか?
SELECT species, COUNT(*) FROM Bird GROUP BY species;
列とそれらの種の数Bird
のみを選択するため、これは意味のある水和オブジェクトをもたらすクエリではありません。species
したがって、Colinが提案した「生の」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 Criteria に関する単一のドキュメントを見つけるのは難しいことがわかったので (API ドキュメントはないようです)、通常は symfony book の第 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);
私は自分でこのように使用したことはないと思いますが、そうかもしれません。