Como posso escrever uma contagem SQL com o grupo pela cláusula usando Propel ORM no Symfony?

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

  •  06-09-2019
  •  | 
  •  

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top