2009-06-01 5 views

Répondre

0

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 ne sais pas si c'est complet.

Mais ce que vous pouvez faire est de nourrir SQL directement à Propel. Ce qui suit est modifié à partir d'un exemple dans 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); 

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

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

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

+0

Comment exécuter ce critère et comment puis-je personnaliser l'hydratation? – NobleUplift

2

Cette requête ne génère pas d'objets significatifs Bird hydratés, car vous ne sélectionnez que la colonne species et le nombre de ces espèces. Donc, a "raw" SQL query as Colin suggested serait probablement le meilleur moyen d'aller ici - mais ne pas hydrater à la fin, il suffit d'obtenir les données de PDOStatement résultant. Si species était une référence à un tableau Species, vous pouvez travailler à partir de là: hydrater Species objets, avec une colonne supplémentaire pour le nombre d'oiseaux par espèce. Si vous utilisez Symfony jusqu'à la version 1.2, je recommande fortement le DbFinder plugin, car il 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 devriez mise à niveau de Propel 1.4 vers Propel 1.5, où François Zaniotto, créateur de DbFinder, a porté une grande partie de ses fonctionnalités et a ajouté plus, donc le code ci-dessus fonctionne dans Propel 1.5 sans plugin supplémentaire.

Questions connexes