2012-03-06 9 views
6

En Doctrina que puedo hacer:Cuentan y agrupan por Propel con

public function getCount() 
{   
     $q = $this->createQuery('q') 
      ->select('*') 
      ->addSelect('count(q.name) as count') 
      ->groupBy('q.name') 
      ->orderBy('count DESC'); 

     return $q->execute();   
} 

¿Cómo puedo hacer lo mismo en Propel en Symfony 1.4?

Respuesta

2

intento:

public function getCount() 
    $c = new Criteria(); 
    $c->addAsColumn('count', 'count(name)'); 
    $c->addDescendingOrderByColumn($c->getColumnForAs('count')); 
    $c->addGroupByColumn('name'); 
    return self::doCount($c); 
} 

Hay algunos buenos fragmentos de información sobre las consultas de propulsión aquí ->http://snippets.symfony-project.org/snippets/tagged/criteria/order_by/date

+0

Debe evitar el uso de criterios. –

+0

@WilliamDURAND ¿te importa ampliar eso? alguna razón en particular ? – ManseUK

+1

La API de ActiveQuery es mucho mejor, realmente fluida, y es la API recomendada para usar desde 1.5. Propel2 se centrará en el enfoque ActiveQuery, no en criterios/criterio. Más sugerencias en esta publicación de blog: http://propel.posterous.com/design-your-queries-like-a-boss –

1

Algo como esto:

$myRows = MyTableQuery::create()-> 
    addAsColumn('count', 'COUNT(name)')-> 
    addGroupByColumn('count')-> 
    addDescendingOrderByColumn('count')-> 
    find(); 

No estoy seguro acerca de el GROUP BY - puede necesitar un alias o volver a especificar la cláusula COUNT. Probarlo y ver lo que funciona mediante experimentación :)

Realmente debe utilizar un auto-completar IDE para tomar ventaja de Propel (Doctrina y para el caso) - sus consultas serán mucho más fáciles de construir.

Mi respuesta habitual normalmente sería como @ ManseUK, es decir, basada en la clase Criteria, pero se eliminará cuando llegue Propel 2, por lo que probablemente sea una buena idea tener el código listo ahora.

+0

No necesita escribir la consulta usted mismo. Simplemente piense que Propel proporciona métodos de terminación como 'find()' y 'count()' por ejemplo. Propel pretende ser lo más simple posible;) –

+1

Como se indica en su respuesta, un simple 'count()' sería insuficiente. – halfer

8

¡Maldita sea! ¡Es más fácil que eso!

Si es necesario contar las filas de resultados para una consulta determinada, es necesario utilizar el método count() terminación, básicamente:

MyTableQuery::create()->count(); 

lea la sección siguiente documentación para obtener más información: http://www.propelorm.org/documentation/03-basic-crud.html#query_termination_methods

Si desea agregar una columna adicional count o nb a su consulta que represente un conjunto de SQL funciones como COUNT o SUM, luego debe utilizar el método withColumn():

$query = MyTableQuery::create() 
    ->withColumn('COUNT(*)', 'Count') 
    ->select(array('Name', 'Count')) 
    ->groupByName() 
    ->orderByCount() 
    ; 

$results = $query->find(); 
+1

Creo que el OP estaba buscando algo más complicado que solo un conteo básico - algo así como 'SELECT nombre, COUNT (*) FROM x GROUP BY name' (el' SELECT * 'en la pregunta puede ser una pista falsa) – halfer

+0

Be justo, y lea la documentación. Para su consulta, simplemente escriba 'MyTableQuery :: create() -> withColumn ('COUNT (*)', 'Count') -> select (array ('Name', 'Count')) -> groupByName() -> find() '. En ambos casos, estás en el camino equivocado. Su voto a la baja no está justificado en absoluto. –

+0

No es mi pregunta, ¡pero sin embargo es una respuesta mucho mejor! ¿Edificarías tu respuesta original? (Estoy en desacuerdo cortésmente sobre la justificación, ya que su respuesta no respondió la pregunta, sin embargo, si corrige su respuesta, me alegro de que vuelva a votar). – halfer

Cuestiones relacionadas