2011-11-17 11 views
7

modellerdircakePHP - nasıl ben öğeleri ilgili model için saymak alabilirim? <code>stores</code> ve <code>product</code> ve onlar tarafından ilişkilidir:

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

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

tüm mağazaların listesini ve sahip oldukları ürünlerin sayısını almak istiyorum. Bu veri türünü döndürmek için aramayı nasıl değiştirmeliyim: $this->Store->find('all', array(<..some conditions..>))?

+1

CakePHP'nin versiyonu? –

+0

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

cevap

16

bir yöntem kullanmaktır Kek yerleşik sizin birlikte counterCache seçenek. Bu muhtemelen en performanslı seçenek, tablonuza bir alan eklemenizi gerektiriyor olsa da. senin stores Tabloda

, sizin derneğe counterCache seçeneği eklemek için Product modelde adlı bir INT alan product_count

ekleyin:

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

Eğer Product kayıtları eklemek veya silmek zaman, otomatik olarak güncellenir ilişkili Store kaydının product_count alan, böylece find işlemlerde değişiklik yapmanıza gerek yoktur.

Bu rotayı seçerseniz, yalnızca ekleme/silme işlemlerinden sonra güncelleştirildiği için, ilk değerin doğru olması için product_count alanını el ile güncelleştirmeniz gerektiğini unutmayın.

+2

+1 bana bir şey öğretmek için :) –

+0

Bu, bir tabloyu pişirirken varsayılan olarak çalışır mı? – Dooltaz

1

Basit tüm ihtiyacınız olan verileri alıp bunu bulmak:

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

mağazaların birinde ürünlerin sayısı '0' sayısı ile değiştirilebilir aşağıdaki kodla iade edilebilir mağazanın dizi endeksi: her mağazada ürünlerin sayısını istiyorsanız

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

, böylece tüm mağazaları üzerinde döngü düşünebiliriz:

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

varsayımlar:

  1. Ürünün genel sayılmaz, her mağazada ürünlerin sayımı istiyorum.
  2. Sen performansı ile çok endişe. 50.000'den fazla kaydınız varsa, bunu eşleştirmeyi düşünebilirsiniz, ancak oldukça karmaşık olacaktır.
2

find('count')'a bakın. senin çifti mağaza verilerle bu veri isteyen varsa

Ancak bu iyi ölçek olmayabilir (therealtomrose tarafından cevap bakınız).

Ben sorun find('count') kullanarak ve veri gruplama yaşadım. Maalesef bu, sizin için sorgu yazmayan çerçevelerin başarısız olduğu durumlardan biridir.

3

ancak ben buradan bunu test edemez, aşağıdaki gibi bir şey çalışma olduğuna inanıyorum. COUNT() içindekiler Kek onun sorguları inşa nasıl çalışmak için verdiği gerekebilir.

$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'dan sonra, conditions numaranızı ve multiple counters per model numaranıza ekleyebilirsiniz.

, herhangi bir tamsayı alanı ekle senin Store ardından Product modelinde bu kullanın:

var $belongsTo = array(
    'Store' => array(
     'className' => 'Store', 
     'foreignKey' => 'store_id', 
     'counterCache' => array(
      'anyfield', array('Product.id >' => 0), 
      'stock' => array('Product.status' => 'stock') 
     ) 
    ) 
); 
İlgili konular