2009-08-11 14 views
5

मैंने हाल ही में एक शॉपिंग कार्ट साइट के ऑर्डर देखने के लिए व्यवस्थापक टूल प्रदान करने के लिए ज़ेंड फ्रेमवर्क (1.8.4) का उपयोग करना शुरू कर दिया है।ज़ेंड: दो ऑब्जेक्ट्स, एक पंक्ति

मैं एक डेटाबेस परिणाम पंक्ति से कई मॉडल (Zend_Db_Table_Row_Abstract) ऑब्जेक्ट्स कुशलतापूर्वक बनाने के लिए करना चाहता हूं।

संबंध सरल है: एक आदेश में एक ग्राहक है (विदेशी कुंजी order_custid=customer.cust_id); एक ग्राहक के पास कई ऑर्डर हैं।

ऑर्डर लोड करना काफी आसान है। विधि यहाँ प्रलेखित का उपयोग करना:

Modeling objects with multiple table relationships in Zend Framework

... मैं तो प्रत्येक के लिए ग्राहक को आकर्षित कर सकता है।


    foreach ($orderList as $o) 
    { 
     cust = $o->findParentRow('Customers'); 
     print_r ($cust); // works as expected. 
    } 

लेकिन जब आप आदेशों की एक लंबी सूची लोड कर रहे हैं - कहें, 40 या अधिक, एक पेजफुल - यह दर्दनाक रूप से धीमा है।

अगला मैंने कोशिश की एक में शामिल हों:


    $custTable = new Customers(); 
    $orderTable = new Orders(); 
    $orderQuery = $orderTable->select() 
     ->setIntegrityCheck(false) // allows joins 
     ->from($orderTable) 
     ->join('customers', 'cust_id=order_custid') 
     ->where("order_status=?", 1); //incoming orders only. 
    $orders = $orderTable->fetchAll($orderQuery); 

यह मैं क्रम में ऑब्जेक्ट की श्रृंखला देता है। print_r($orders) दिखाता है कि उनमें से प्रत्येक में एक संरक्षित सदस्य में, कॉलम सूची शामिल है, कच्चे फ़ील्ड नाम ऑर्डर_ * और cust_ * के साथ।

लेकिन cust_ * फ़ील्ड से ग्राहक ऑब्जेक्ट कैसे बनाएं, जो मुझे उन ऑर्डर ऑब्जेक्ट्स में मिलता है?


foreach ($orders as $o) { 
    $cols = $o->toArray(); 
    print_r ($cols); // looks good, has cust_* fields... 

    $cust = new Customer(array('table' => 'Customer', 'data' => $cols)); 
    // fails - $cust->id, $cust->firstname, etc are empty 

    $cust->setFromArray($cols); 
    // complains about unknown 'order_' fields. 

} 

क्या जुड़ी हुई पंक्तियों से ऑर्डर और ग्राहक ऑब्जेक्ट बनाने के लिए कोई अच्छा तरीका है? या मुझे टेबल गेटवे के बिना क्वेरी चलाने चाहिए, कच्चे परिणाम सेट प्राप्त करें, और प्रत्येक फ़ील्ड को एक-एक करके नई बनाई गई वस्तुओं में कॉपी करें?

+0

जहां तक ​​मुझे पता है कि Zend_Db ऐसा नहीं करता है। मुझे भी एक समाधान में बहुत दिलचस्पी होगी। – markus

उत्तर

1

Zend_Db ऐसा करने के लिए सुविधा विधियां प्रदान नहीं करता है।

हाइपोटेटिक रूप से, यह कई टेबलों से प्राप्त पंक्तियों के लिए फेकाडे पैटर्न का उपयोग करने के लिए निफ्टी होगा। मुखौटा वर्ग ट्रैक रखेगा कि कौन से कॉलम प्रत्येक संबंधित तालिका से संबंधित हैं। जब आप setFromArray() विधि के साथ फ़ील्ड का एक अलग क्षेत्र या पूरे समूह को सेट करते हैं, तो मुखौटा प्रत्येक तालिका के लिए पंक्ति वस्तुओं में फ़ील्ड को मैप करने का तरीका जानेंगे और UPDATE प्रभावित तालिकाओं पर बयान लागू करेगा।

वैकल्पिक रूप से, आप Zend_Db_Table_Row_Abstract उपवर्गीकरण, __set() व्यवहार चुपचाप अज्ञात स्तंभों की अनदेखी करने को बदलने के बजाय एक अपवाद फेंक कर अज्ञात क्षेत्रों में समस्या को हल करने सकता है।

आपके पास एसक्यूएल सब कुछ करने के लिए ओओ इंटरफ़ेस नहीं हो सकता है। रेत में कुछ रेखा होनी चाहिए जहां आप तय करते हैं कि आम मामलों का उचित सेट कवर किया गया है, और एसक्यूएल के साथ कुछ भी जटिल होना चाहिए।

+0

हाइबरनेट (जावा) यह सुंदरता से करता है; यदि आप करते हैं: query.addEntity (Order.class) query.addEntity (customer.class); ... फिर आप जो वापस प्राप्त करते हैं वह एक सूची है, जिसमें से प्रत्येक पंक्ति निर्दिष्ट ऑर्डर में उन दो ऑब्जेक्ट प्रकारों के साथ एक सरणी है। –

+0

यह अच्छा है। लेकिन इसके लायक होने के लिए, हाइबरनेट में जावा कोड की 490,000 लाइनें शामिल हैं। Zend_Db PHP कोड की लगभग 2,700 लाइनें है। PHP प्लेटफ़ॉर्म की रनटाइम प्रकृति की वजह से, यह कोड ब्लोट के प्रति अधिक संवेदनशील है, और इसलिए पुस्तकालयों को दुबला बनाने के लिए यह अधिक महत्वपूर्ण है, केवल सबसे अधिक उपयोग की जाने वाली विशेषताओं पर लागू करना। –

+0

अच्छा बिंदु! हां, मैं कारण के भीतर ढांचे के आकार को रखने की आवश्यकता देख सकता हूं। –

1

मैं ऑब्जेक्ट्स में डेटाबेस पंक्ति फ़ील्ड असाइन करने के लिए इस विधि का उपयोग करता हूं। मैं सेटर विधियों का उपयोग करता हूं, लेकिन यह शायद ऑब्जेक्ट पर केवल गुणों के साथ भी किया जा सकता है।

public function setOptions(array $options){ 
    $methods = get_class_methods($this); 
    foreach ($options as $key => $value) { 
     $method = 'set' . ucfirst($key); 
     if (in_array($method, $methods)) { 
      $this->$method($value); 
     } 
    } 
    return $this; 
} 
संबंधित मुद्दे