2011-11-17 10 views
7

मॉडल हैं: stores और product, और वे से जुड़े रहे हैं:केकेपीएचपी - मैं वस्तुओं को संबंधित मॉडल के लिए कैसे गिन सकता हूं?

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

केक v1.3 ....... – yossi

उत्तर

16

एक तरीका है केक के अंतर्निहित counterCache विकल्प को अपने सहयोग में उपयोग करना है। यह शायद सबसे अधिक प्रदर्शन विकल्प है, हालांकि इसे आपकी तालिका में फ़ील्ड जोड़ने की आवश्यकता होती है।

अपने stores तालिका में, एक INT क्षेत्र कहा जाता product_count

जोड़ने अपने Product मॉडल में आपके सहयोग के लिए counterCache विकल्प जोड़ने:

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']); 
} 

अनुमान मैं बनाने हूँ:

  1. आप उत्पादों की गिनती प्रत्येक दुकान पर, उत्पाद समग्र गिनती नहीं चाहते हैं।
  2. आप प्रदर्शन से बहुत चिंतित नहीं हैं। यदि आपके पास 50,000 से अधिक रिकॉर्ड हैं या तो, आप इसे वापस जोड़ना चाहेंगे, लेकिन यह काफी जटिल होगा।
2

find('count') देखें।

बहरहाल, यह अच्छी तरह से स्केल नहीं हो सकती है यदि आपके जोड़ी दुकान डेटा के साथ इस डेटा के लिए देख (therealtomrose द्वारा जवाब देखें)।

मुझे find('count') और समूह डेटा का उपयोग करने में परेशानी हुई है। दुर्भाग्यवश यह उन किनारे के मामलों में से एक है जहां आपके लिए फ्रेमवर्क लेखन प्रश्न विफल हो जाते हैं।

3

मुझे विश्वास है कि निम्नलिखित की तरह कुछ काम करेगा, हालांकि मैं इसे यहां से परीक्षण नहीं कर सकता। COUNT() सामग्रियों के साथ काम करने के लिए tweaking की आवश्यकता हो सकती है कि कैसे केक अपने प्रश्नों का निर्माण करता है।

$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

केकपीएचपी 2.0 के बाद आप अपनी गणना और multiple counters per model पर conditions भी जोड़ सकते हैं।

के लिए किसी भी पूर्णांक फ़ील्ड जोड़ें अपने Store फिर अपने Product मॉडल में इस का उपयोग करें:

var $belongsTo = array(
    'Store' => array(
     'className' => 'Store', 
     'foreignKey' => 'store_id', 
     'counterCache' => array(
      'anyfield', array('Product.id >' => 0), 
      'stock' => array('Product.status' => 'stock') 
     ) 
    ) 
); 
संबंधित मुद्दे