Como posso escrever uma contagem SQL com o grupo pela cláusula usando Propel ORM no Symfony?
Pergunta
Como posso escrever a seguinte consulta SQL usando o Propel ORM?
SELECT species, COUNT(*) FROM Bird GROUP BY species;
Nenhuma solução correta
Outras dicas
Esta não é uma consulta que resultaria em objetos Bird
hidratados significativas, já que você só selecionar a coluna species
ea contagem dessas espécies. Então, a 'consulta SQL cru', como Colin sugeriu provavelmente a melhor maneira de ir aqui -. mas não hidratado no final, é só pegar os dados do PDOStatement
resultando
Se species
era uma referência a uma tabela Species
, você pode trabalhar a partir de lá: objetos Species
hidrato, com uma coluna extra para as contagens de aves por espécie. Se você usar o Symfony até a versão 1.2, eu recomendo o DbFinder plug-in , como simplifica muito o trabalho com Criteria
, e tem métodos para selecionar uma única coluna suplementar:
$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 você usar o Symfony 1.3 ou 1.4, você deve atualizar o pacote Propel 1,4 a Propel 1.5, onde François Zaniotto, criador do DbFinder, portado muito de sua funcionalidade e acrescentou mais, de modo que o código acima funciona em Propel 1.5 sem um extra plugin.
$c = new Criteria(); $c->addAsColumn('cnt', "count(*)"); self::addSelectColumns($c); $c->addGroupByColumn(BirdPeer::SPECIES);
mas você vai precisar fazer hidratação personalizado se você precisa para obter a contagem (*) para seus objetos povoadas.
Eu descobri que é difícil encontrar um único documento sobre os critérios Propel (não parece ser um documento API sobre ele) assim que eu costumo usar a lista no Capítulo 8 do livro symfony; mas não tenho idéia se ou não isso é abrangente.
Mas o que você pode fazer é alimentar SQL diretamente para Propel. O que se segue é modificado a partir de um exemplo em http://propel.phpdb.org/ docs / user_guide / capítulos / 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);
Eu não acho que eu já utilizado desta maneira me, embora eu possa ter.