Come faccio a scrivere un numero di SQL con il gruppo dalla clausola utilizzando Propel in Symfony?

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

  •  06-09-2019
  •  | 
  •  

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top