2012-03-06 28 views
6

Trong học thuyết tôi có thể làm:Count và các nhóm bởi với Propel

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

     return $q->execute();   
} 

Làm thế nào tôi có thể làm điều tương tự trong Propel trong Symfony 1.4?

Trả lời

2

thử:

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

Có một số đoạn tốt thông tin trên các truy vấn propel đây ->http://snippets.symfony-project.org/snippets/tagged/criteria/order_by/date

+0

Bạn nên tránh sử dụng tiêu chí. –

+0

@WilliamDURAND chăm sóc yo mở rộng trên đó? Bất kỳ lý do cụ thể nào ? – ManseUK

+1

API ActiveQuery tốt hơn nhiều, rất thông thạo và đó là API được đề xuất để sử dụng kể từ 1.5. Propel2 sẽ tập trung vào cách tiếp cận ActiveQuery, không tập trung vào tiêu chí/tiêu chí. Các gợi ý khác về bài đăng trên blog này: http://propel.posterous.com/design-your-queries-like-a-boss –

1

Something như này:

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

Tôi không chắc chắn về GROUP BY - bạn có thể cần một bí danh hoặc để xác định lại mệnh đề COUNT. Hãy thử nó và xem những gì hoạt động bằng cách thử nghiệm :)

Bạn thực sự sử dụng một IDE tự động hoàn thành để tận dụng Propel (và Doctrine cho vấn đề đó) - các truy vấn của bạn sẽ dễ xây dựng hơn nhiều. Câu trả lời bình thường của tôi thường giống như @ ManseUK, nghĩa là dựa trên lớp Tiêu chí - nhưng điều đó sẽ bị loại bỏ khi Propel 2 xuất hiện, vì vậy, có thể là một ý tưởng hay để chuẩn bị sẵn mã của bạn ngay bây giờ.

+0

Bạn không cần tự viết truy vấn. Chỉ cần nghĩ rằng Propel cung cấp các phương thức chấm dứt như 'find()', và 'count()' chẳng hạn. Propel nhằm mục đích đơn giản nhất có thể;) –

+1

Như đã lưu ý trong câu trả lời của bạn, một 'count()' đơn giản sẽ không đủ. – halfer

8

Đã chết! Nó dễ hơn thế!

Nếu bạn cần phải đếm hàng kết quả cho một truy vấn cụ thể, bạn cần phải sử dụng phương pháp count() chấm dứt, về cơ bản:

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

Đọc phần tài liệu hướng dẫn sau để biết thêm thông tin: http://www.propelorm.org/documentation/03-basic-crud.html#query_termination_methods

Nếu bạn muốn thêm một cột bổ sung count hoặc nb vào truy vấn của bạn đại diện cho một hàm tổng hợp SQL như COUNT hoặc SUM, thì bạn nên sử dụng phương thức withColumn():

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

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

Tôi nghĩ rằng OP đang tìm kiếm một cái gì đó phức tạp hơn chỉ là một số cơ bản - một cái gì đó giống như 'SELECT tên, COUNT (*) TỪ x GROUP BY name' (' SELECT * 'trong câu hỏi có thể là một cá trích đỏ) – halfer

+0

công bằng và đọc tài liệu. Đối với truy vấn của bạn, chỉ cần viết 'MyTableQuery :: create() -> withColumn ('COUNT (*)', 'Count') -> select (mảng ('Tên', 'Đếm')) -> groupByName() -> find() '. Trong cả hai trường hợp, bạn đang đi sai đường dẫn. Bỏ phiếu xuống của bạn là không hợp lý ở tất cả. –

+0

Nó không phải là câu hỏi của tôi, nhưng đó là một câu trả lời tốt hơn nhiều! Bạn có chỉnh sửa phản hồi ban đầu của mình không? (Tôi lịch sự không đồng ý về việc biện minh, vì câu trả lời của bạn không trả lời câu hỏi, tuy nhiên nếu bạn sửa câu trả lời của mình, tôi sẽ vui vẻ hoàn nguyên ý kiến ​​này). – halfer

Các vấn đề liên quan