Wie kann ich eine SQL-Zählung mit group by-Klausel mit Propel ORM in Symfony schreiben?

StackOverflow https://stackoverflow.com/questions/933473

  •  06-09-2019
  •  | 
  •  

Frage

Wie kann ich die folgende SQL-Abfrage mit dem Propel ORM schreiben?

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

Keine korrekte Lösung

Andere Tipps

Dies ist keine Abfrage, die in sinnvoller hydrierten Bird Objekten führen würde, da Sie nur die species Spalte und die Zählung dieser Arten wählen. So eine ‚rohe‘ SQL-Abfrage als Colin vorgeschlagen wäre wahrscheinlich der beste Weg, hier zu gehen -., aber nicht am Ende Hydrat, nur die Daten aus dem resultierenden PDOStatement erhält

Wenn species ein Verweis auf einen Species Tisch ist, konnte man von dort aus arbeiten: Hydrat Species Objekten, mit einer zusätzlichen Spalte für die Vogelzählungen pro Spezies. Wenn Sie Symfony bis zur Version 1.2 verwenden, empfehle ich die DbFinder Plugin , wie es stark vereinfacht mit Criteria zu arbeiten, und hat Methoden, um eine einzelne Zusatzspalte wählen:

$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";
}

Wenn Sie Symfony 1.3 oder 1.4 verwenden, sollten Sie die mitgelieferte Propel 1.4 Upgrade 1,5 bis Propel, wo François Zaniotto, den Schöpfer von DbFinder, viel von seiner Funktionalität portierte und hinzugefügt mehr, so dass der obige Code funktioniert in Propel 1.5 ohne zusätzliche Plugin.

$c = new Criteria();
$c->addAsColumn('cnt', "count(*)");
self::addSelectColumns($c);
$c->addGroupByColumn(BirdPeer::SPECIES);

, aber Sie werden benutzerdefinierte feuchtigkeitsspendend tun müssen, wenn Sie Zahl brauchen, um (*), um Ihre besiedelten Objekte.

Ich habe es schwer fand ein einzelnes Dokument auf Propel Kriterien zu finden (es scheint nicht ein API-Dokument auf es zu sein), damit ich in der Regel die Liste in Kapitel 8 des Symfony Buch verwenden; aber ich habe keine Ahnung, ob oder nicht, das ist umfassend.

Aber was Sie tun können, ist SQL einzuspeisen direkt zu treiben. Das Folgende ist aus einem modifizierten Beispiel in http://propel.phpdb.org/ docs / user_guide / Kapitel / 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);

Ich glaube nicht, dass ich jemals auf diese Weise selbst verwendet habe, obwohl ich haben könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top