¿Cómo puedo escribir un recuento de SQL con la cláusula GROUP BY usando ORM Propel en Symfony?

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

  •  06-09-2019
  •  | 
  •  

Pregunta

¿Cómo puedo escribir la siguiente consulta SQL mediante el ORM Propel?

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

No hay solución correcta

Otros consejos

Esto no es una consulta que daría lugar a objetos Bird hidratados significativas, ya que sólo se selecciona la columna de la species y el recuento de estas especies. Así '' una consulta SQL en bruto como Colin sugirió probablemente la mejor manera de ir aquí -. pero no hidratar al final, acaba de obtener los datos de la PDOStatement resultante

Si species era una referencia a una tabla Species, se puede trabajar a partir de ahí: hidrato de objetos Species, con una columna adicional para los conteos de aves por especie. Si utiliza Symfony hasta la versión 1.2, le recomiendo el DbFinder complemento , ya que simplifica enormemente el trabajo con Criteria, y tiene métodos para seleccionar una sola columna suplementaria:

$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 utiliza Symfony 1.3 o 1.4, debe actualizar la Propel paquete de 1.4 a Propel 1.5, donde François Zaniotto, creador de DbFinder, portado gran parte de su funcionalidad y ha añadido más, por lo que el código anterior funciona en Propel 1.5 sin un extra plugin.

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

pero tendrá que hacer por encargo hidratante si es necesario para obtener la cuenta (*) a los objetos pobladas.

He encontrado que es difícil encontrar un solo documento sobre criterios de Propel (no parece ser un documento API en él) por lo que suelen utilizar la lista en el Capítulo 8 del libro de symfony; pero no tengo ni idea de si es o no es exhaustiva.

Pero lo que puede hacer es alimentar SQL directamente a Propel. La siguiente es una modificación de un ejemplo en el 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);

No creo que he utilizado de esta manera a mí mismo, a pesar de que podría tener.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top