2011-11-17 1 views
7

모델은cakePHP - 관련 모델에 대한 항목 수를 얻으려면 어떻게해야합니까? <code>stores</code> 및 <code>product</code>, 그리고 그들은에 의해 연결되어 있습니다 :

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

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

내가 모든 상점의 목록과 그들이 가지고있는 제품의 수를 싶어. 해당 데이터 유형을 반환하려면 전화 번호 : $this->Store->find('all', array(<..some conditions..>))을 어떻게 수정해야합니까?

+1

CakePHP의 버전을? –

+0

cake v1.3 ....... – yossi

답변

16

하나의 방법은 Cake에 내장 된 counterCache 옵션을 사용하는 것입니다. 이것은 테이블에 필드를 추가해야하지만 가장 뛰어난 옵션입니다. 당신의 stores 표에서

, 당신의 관계에 counterCache 옵션을 추가하려면 Product 모델에서라는 INT 필드 product_count

을 추가

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

당신이 Product 레코드를 추가 또는 삭제할 때마다 자동으로 업데이트됩니다 연관된 Store 레코드의 product_count 필드를 사용하여 find 작업을 변경할 필요가 없습니다.

이 경로를 선택하는 경우 추가/삭제 작업 후에 만 ​​업데이트되므로 초기 값이 올바르도록 product_count 필드를 수동으로 업데이트해야합니다.

+2

+1 나를 가르치기 위해 : –

+0

테이블을 베이킹 할 때이 기능이 기본적으로 작동합니까? – Dooltaz

1

간단한 모두가 당신이 필요로하는 데이터를 가져옵니다 찾을 :

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

상점 중 하나에서 제품의 수는 '0'의 번호로 대체 할 수있는 다음과 같은 코드를 반환 할 수 있습니다 상점의 배열 인덱스 : 각 매장에서 제품의 수를 원하는 경우

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

, 당신은 따라서 모든 상점에 걸쳐 반복 고려할 수 :

foreach ($Stores as $Store) { 
    echo count($Store['Products']); 
} 
내가 만드는 중이라서3210 개

가정 :

  1. 당신은 제품 전체에 포함되지, 각 점포에서 제품의 수를 원한다.
  2. 성능에 너무 신경 쓰지 않아도됩니다. 50,000 개가 넘는 레코드가 있다면 이것을 다시 페어링하는 것이 좋겠지 만 상당히 복잡 할 것입니다.
2

체크 아웃 find('count'). 당신이 저장 데이터와이 데이터를 찾고있는 경우

그러나,이 잘 확장되지 않을 수 있습니다 (therealtomrose하여 답을 참조).

find('count') 및 그룹화 데이터를 사용하는 데 문제가있었습니다. 불행히도 이것은 당신을 위해 쿼리를 작성하는 프레임 워크가 실패하는 경우 중 하나입니다.

3

나는 다음과 같은 것이 효과가있을 것이라고 믿지만, 여기서 테스트 할 수는 없다. COUNT() 내용은 Cake가 쿼리를 구성하는 방법을 작업하기 위해 조정이 필요할 수 있습니다.

$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

CakePHP 2.0 이후에 conditionsmultiple counters per model을 추가 할 수도 있습니다.

가 정수 필드를 추가하여 Store 다음 Product 모델이 사용

var $belongsTo = array(
    'Store' => array(
     'className' => 'Store', 
     'foreignKey' => 'store_id', 
     'counterCache' => array(
      'anyfield', array('Product.id >' => 0), 
      'stock' => array('Product.status' => 'stock') 
     ) 
    ) 
); 
관련 문제