2012-03-06 44 views
6

教義我可以這樣做:計數和組通過與波輪

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

     return $q->execute();   
} 

我如何可以做同樣在行走中的Symfony 1.4嗎?

回答

2

嘗試:

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

上有推進的查詢信息的一些好的片段在這裏 - >http://snippets.symfony-project.org/snippets/tagged/criteria/order_by/date

+0

您應該避免使用標準。 – 2012-03-10 13:00:24

+0

@WilliamDURAND關懷喲擴展?任何特定的原因? – ManseUK 2012-03-10 13:31:21

+1

ActiveQuery API要好得多,真的很流暢,而且它是從1.5開始使用的推薦API。 Propel2將專注於ActiveQuery方法,而不是標準/標準。有關此博客帖子的更多提示:http://propel.posterous.com/design-your-queries-like-a-boss – 2012-03-10 13:45:31

1

東西這樣:

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

我不知道GROUP BY - 您可能需要別名,或重新指定COUNT子句。試試吧,看看有什麼效果通過實驗:)

你真的必須使用自動完成IDE利用波輪的(和學說爲此事) - 你的查詢會更容易構造。

我通常的回覆通常就像@ ManseUK's,即基於Criteria類 - 但是當Propel 2出現時會被逐漸淘汰,所以現在準備好你的代碼可能是一個好主意。

+0

您無需自己編寫查詢。試想Propel提供終止方法,例如'find()'和'count()'。 Propel的目標是儘可能簡單;) – 2012-03-10 13:10:38

+1

正如您的答案中指出的那樣,一個簡單的'count()'是不夠的。 – halfer 2012-03-10 19:44:47

8

該死!比這更容易!

如果你需要統計結果行給定查詢,您需要使用count()端接方法,基本上是:

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

閱讀下面的文檔部分的詳細資料:http://www.propelorm.org/documentation/03-basic-crud.html#query_termination_methods

如果您想要爲您的查詢添加一個countnb額外的列,這些列表示像COUNTSUM這樣的SQL聚合函數,那麼您應該使用withColumn()方法:

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

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

我認爲OP正在尋找比基本計數更復雜的東西 - 例如'SELECT name,COUNT(*)FROM x GROUP BY name'(問題中的SELECT *'可能是一條紅色鯡魚) – halfer 2012-03-10 13:20:39

+0

Be公平,並閱讀文件。對於你的查詢,只需編寫MyTableQuery :: create() - > withColumn('COUNT(*)','Count') - > select(array('Name','Count')) - > groupByName() - >找到()'。 在這兩種情況下,你都走錯了路。你的投票不合理。 – 2012-03-10 13:27:44

+0

這不是我的問題,但不過這是一個更好的答案!你會編輯你的原始回覆? (我有禮貌地不同意理由,因爲你的回答沒有回答這個問題;但是如果你解決了你的答案,我會很樂意回覆downvote)。 – halfer 2012-03-10 13:29:53