2011-11-17 23 views
7

Các mô hình là: storesproduct, và chúng có liên quan theo:cakePHP - làm thế nào để tôi nhận được các mục đếm cho một mô hình liên quan?

var $belongsTo = array(
    'Store' => array(
    'className' => 'Store', 
    'foreignKey' => 'store_id' 
     )) 

var $hasMany = array(
    'Product' => array(
'className' => 'Product', 
'foreignKey' => 'store_id' 
    )) 

Tôi muốn có được một danh sách tất cả các cửa hàng và số lượng của sản phẩm mà họ có. Tôi nên sửa đổi cuộc gọi: $this->Store->find('all', array(<..some conditions..>)) để trả lại loại dữ liệu đó như thế nào?

+1

Phiên bản nào của CakePHP? –

+0

bánh v1.3 ....... – yossi

Trả lời

16

Một phương pháp là sử dụng tùy chọn counterCache được tích hợp sẵn trong bánh của bạn. Đây có lẽ là lựa chọn hiệu quả nhất, mặc dù nó yêu cầu thêm một trường vào bảng của bạn.

Trong bảng stores của bạn, thêm một trường INT gọi product_count

Trong mô hình Product bạn thêm tùy chọn counterCache hiệp hội của bạn:

var $belongsTo = array(
    'Store' => array(
    'className' => 'Store', 
    'foreignKey' => 'store_id', 
    'counterCache' => true 
)); 

Bất cứ khi nào bạn thêm hoặc xóa Product hồ sơ, nó sẽ tự động cập nhật trường product_count của bản ghi Store được liên kết, để không cần thay đổi hoạt động find của bạn.Lưu ý rằng nếu bạn chọn tuyến đường này, bạn sẽ cần phải cập nhật trường product_count theo cách thủ công để có giá trị ban đầu là chính xác vì nó chỉ cập nhật sau khi thêm/xóa các hoạt động.

+2

+1 để dạy tôi điều gì đó :) –

+0

Điều này có hoạt động theo mặc định khi nướng bàn không? – Dooltaz

1

Một đơn giản tất cả sẽ lấy dữ liệu bạn cần:

$Stores = $this->Store->find('all'); 

Số đếm sản phẩm tại một trong những cửa hàng có thể được trở lại với đoạn mã sau nơi '0' có thể được thay thế bằng số lượng các chỉ số mảng cửa hàng của:

count($Stores[0]['Products']); //returns an integer 

Nếu bạn muốn đếm các sản phẩm tại mỗi cửa hàng, bạn có thể xem xét Looping trên tất cả các cửa hàng như sau:

foreach ($Stores as $Store) { 
    echo count($Store['Products']); 
} 

Giả định tôi đang thực hiện:

  1. Bạn muốn đếm số lượng sản phẩm tại mỗi cửa hàng, không tính tổng sản phẩm.
  2. Bạn không quá quan tâm đến hiệu suất. Nếu bạn có hơn 50.000 hồ sơ hoặc như vậy, bạn có thể cân nhắc việc ghép nối lại, nhưng nó sẽ phức tạp hơn nhiều.
2

Kiểm tra find('count').

Tuy nhiên, điều này có thể không quy mô tốt nếu bạn đang tìm kiếm để cặp dữ liệu này với dữ liệu lưu trữ (xem câu trả lời bằng cách therealtomrose).

Tôi gặp sự cố khi sử dụng find('count') và nhóm dữ liệu. Thật không may đây là một trong những trường hợp cạnh mà các khung viết các truy vấn cho bạn thất bại.

3

Tôi tin rằng điều gì đó như sau sẽ hiệu quả, tuy nhiên tôi không thể kiểm tra nó từ đây. Nội dung COUNT() có thể cần tinh chỉnh để làm việc với cách Cake xây dựng các truy vấn của nó.

$this->Store->virtualFields = array('product_count' => 'COUNT(Product.id)'); 
$this->Store->find('all', array(
    'fields' => array('Store.id', 'Store.product_count'), 
    'group' => array('Store.id'), 
)); 
2

Sau CakePHP 2.0, bạn cũng có thể thêm conditions vào số của mình và multiple counters per model.

Thêm bất kỳ trường số nguyên để bạn Store sau đó sử dụng này trong mô hình Product của bạn:

var $belongsTo = array(
    'Store' => array(
     'className' => 'Store', 
     'foreignKey' => 'store_id', 
     'counterCache' => array(
      'anyfield', array('Product.id >' => 0), 
      'stock' => array('Product.status' => 'stock') 
     ) 
    ) 
); 
Các vấn đề liên quan