Comment puis-je écrire un compte SQL avec le groupe par clause à Propel ORM dans Symfony?

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

  •  06-09-2019
  •  | 
  •  

Question

Comment puis-je écrire la requête SQL à l'aide Propel ORM?

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

Pas de solution correcte

Autres conseils

Ce n'est pas une requête qui entraînerait des objets Bird significatifs hydratés, puisque vous sélectionnez uniquement la colonne species et le nombre de ces espèces. Donc, une « première » requête SQL comme Colin suggéré serait probablement la meilleure façon d'y aller -. mais ne hydrate pas à la fin, juste obtenir les données du PDOStatement résultant

Si species était une référence à une table de Species, vous pouvez travailler à partir de là: objets Species d'hydrate, avec une colonne supplémentaire pour les oiseaux par espèce compte. Si vous utilisez Symfony jusqu'à la version 1.2, je vous recommande vivement le DbFinder plug-in , comme simplifie grandement le travail avec Criteria, et a des méthodes pour sélectionner une seule colonne supplémentaire:

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

Si vous utilisez Symfony 1.3 ou 1.4, vous devez mettre à niveau le Propel fourni 1,4 à Propel 1.5, où François Zaniotto, créateur de DbFinder, porté une grande partie de ses fonctionnalités et a ajouté plus, de sorte que le code ci-dessus fonctionne Propel 1.5 sans un supplément plug-in.

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

mais vous devez faire hydratantes personnalisé si vous avez besoin pour obtenir le nombre (*) à vos objets peuplés.

Je l'ai trouvé difficile de trouver un seul document sur les critères Propel (il ne semble pas être un document de l'API sur elle) donc je l'habitude d'utiliser la liste au chapitre 8 du livre Symfony; mais je n'ai aucune idée si oui ou non c'est complet.

Mais qu'est-ce que vous pouvez faire est d'alimenter directement SQL à Propel. Ce qui suit est modifié à partir d'un exemple dans http://propel.phpdb.org/ docs / User_Guide / chapitres / 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);

Je ne pense pas que je l'ai jamais utilisé de cette façon moi-même, bien que je pourrais avoir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top