2012-03-06 10 views
6

In Dottrina posso fare:Conte e di gruppo-by con Propel

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

     return $q->execute();   
} 

Come posso fare lo stesso in Propel in Symfony 1.4?

risposta

2

prova:

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

Ci sono alcune buone frammenti di informazioni query Propel qui ->http://snippets.symfony-project.org/snippets/tagged/criteria/order_by/date

+0

È necessario evitare l'uso di criteri. –

+0

@WilliamDURAND cura di espanderti? qualche motivo particolare? – ManseUK

+1

L'API ActiveQuery è molto meglio, molto fluente, ed è l'API consigliata da usare da 1.5. Propel2 si concentrerà sull'approccio ActiveQuery, non su criteri/criteri. Altri suggerimenti su questo post del blog: http://propel.posterous.com/design-your-queries-like-a-boss –

1

Qualcosa come questo:

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

io non sono sicuro di GROUP BY - potrebbe essere necessario un alias o specificare nuovamente la clausola COUNT. Provatelo e vedere che cosa funziona con la sperimentazione :)

È davvero necessario utilizzare un auto-completamento IDE per approfittare di Propel (e Doctrine per questo) - le vostre domande sarà molto più facile da costruire.

La mia solita risposta sarebbe normalmente come @ ManseUK di, vale a dire in base alla classe Criteria - ma che sarà gradualmente ritirate non appena Propel 2 arriva, quindi è probabilmente una buona idea per ottenere il codice pronto.

+0

Non è necessario scrivere la query da soli. Basti pensare che Propel fornisce metodi di terminazione come 'find()' e 'count()' per esempio. Propel vuole essere il più semplice possibile) –

+1

Come notato nella risposta, un semplice 'count()' sarebbe insufficiente. – halfer

8

Dannato! È più facile di così!

Se è necessario contare le righe di risultati per una determinata query, è necessario utilizzare il metodo count() di terminazione, in fondo:

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

leggere la sezione seguente documentazione per ulteriori informazioni: http://www.propelorm.org/documentation/03-basic-crud.html#query_termination_methods

Se aggiungere una colonna aggiuntiva count o nb alla query che rappresenta una funzione di aggregazione SQL come COUNT o SUM, quindi è necessario utilizzare il metodo withColumn():

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

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

Penso che l'OP cercasse qualcosa di più complicato di un semplice conteggio base - qualcosa come 'SELECT name, COUNT (*) FROM x GROUP BY name' (il' SELECT * 'nella domanda potrebbe essere una falsa pista) – halfer

+0

Be giusto, e leggere la documentazione. Per la tua query, scrivi 'MyTableQuery :: create() -> withColumn ('COUNT (*)', 'Count') -> select (array ('Name', 'Count')) -> groupByName() -> find() '. In entrambi i casi, sei sulla strada sbagliata. Il tuo voto negativo non è affatto giustificato. –

+0

Non è una mia domanda, ma comunque è una risposta molto migliore! Vuoi modificare la tua risposta originale? (Sono educatamente in disaccordo sulla giustificazione, dal momento che la tua risposta non ha risposto alla domanda, tuttavia se risolvi la tua risposta, ricambierò felicemente il downvote). – halfer