Come faccio a scrivere un numero di SQL con il gruppo dalla clausola utilizzando Propel in Symfony?
Domanda
Come faccio a scrivere la seguente query SQL tramite il Propel?
SELECT species, COUNT(*) FROM Bird GROUP BY species;
Nessuna soluzione corretta
Altri suggerimenti
Questa non è una domanda che si tradurrebbe in significativi oggetti Bird
idratati, dal momento che si seleziona solo la colonna species
e il numero di tali specie. Quindi, una 'query SQL cruda', come suggerito Colin sarebbe probabilmente il modo migliore per andare qui -. ma non idratare, alla fine, solo ottenere i dati dal PDOStatement
risultante
Se species
era un riferimento a una tabella Species
, si potrebbe lavorare da lì: oggetti idrato Species
, con una colonna in più per i conti di uccelli per specie. Se si usa Symfony fino alla versione 1.2, consiglio vivamente il DbFinder plug , in quanto semplifica notevolmente lavorare con Criteria
, ed ha metodi per selezionare una singola colonna supplementare:
$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";
}
Se si usa Symfony 1.3 o 1.4, si dovrebbe aggiornare il bundle Propel 1.4 a Propel 1.5, dove François Zaniotto, creatore di DbFinder, portato gran parte della sua funzionalità e ha aggiunto di più, in modo che il codice precedente funziona in Propel 1.5, senza un extra plugin.
$c = new Criteria(); $c->addAsColumn('cnt', "count(*)"); self::addSelectColumns($c); $c->addGroupByColumn(BirdPeer::SPECIES);
, ma è necessario fare idratante personalizzato se è necessario per ottenere il conteggio (*) per gli oggetti popolate.
ho trovato difficoltà a trovare un unico documento sui criteri di Propel (non sembra essere un documento API su di esso) così io di solito utilizzare l'elenco nel capitolo 8 del libro di symfony; ma non ho idea se questo è completo.
Ma cosa si può fare è quello di alimentare direttamente SQL a Propel. Di seguito viene modificato da un esempio in http://propel.phpdb.org/ docs / user_guide / capitoli / 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);
Non credo che abbia mai usato in questo modo io stesso, anche se potrei avere.