3

Propel ORM を使用して次の SQL クエリを作成するにはどうすればよいですか?

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

3 に答える 3

2

列とそれらの種の数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 で動作します。

于 2010-05-17T08:14:08.327 に答える
1
$c = new Criteria();
$c->addAsColumn('cnt', "count(*)");
self::addSelectColumns($c);
$c->addGroupByColumn(BirdPeer::SPECIES);

ただし、移入されたオブジェクトに count(*) を取得する必要がある場合は、カスタム ハイドレーティングを行う必要があります。

于 2009-06-04T13:02:53.090 に答える
0

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);

私は自分でこのように使用したことはないと思いますが、そうかもしれません。

于 2009-06-01T15:57:43.067 に答える