जहां अस्पष्ट स्तंभ नामों के साथ खंड में विरोध होता है


28

इसके लिए थोड़ा सा संदर्भ। मैं अधिक कॉलम रखने के लिए बिक्री आदेश निर्यात फ़ंक्शन (ग्रिड के माध्यम से) का विस्तार करना चाहता हूं। मैंने एक मॉड्यूल बनाया है जो निर्यात के लिए एक नया ग्रिड जोड़ता है और एक नया संग्रह मॉडल भी है जो मूल का विस्तार करता है। यह _beforeLoad () फ़ंक्शन का उपयोग करता है ताकि मैं उन तालिकाओं में शामिल हो सकूं जिनकी मुझे आवश्यकता है।

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

SELECT `main_table`.*, `sales`.`total_qty_ordered`, `sales`.`entity_id` AS `order_id`, `sagepay`.`vendor_tx_code` FROM `sales_flat_order_grid` AS `main_table`
 LEFT JOIN `sales_flat_order` AS `sales` ON main_table.increment_id = sales.increment_id
 LEFT JOIN `sagepaysuite_transaction` AS `sagepay` ON order_id = sagepay.order_id WHERE (increment_id LIKE '%100000261%') GROUP BY `main_table`.`entity_id`

जहां मैं _addColumnFilterToCollection () फ़ंक्शन में अन्य तालिकाओं में शामिल होने से पहले यह खंड जोड़ा जाता है

protected function _addColumnFilterToCollection($column)
    {
        if ($this->getCollection()) {
            $field = ( $column->getFilterIndex() ) ? $column->getFilterIndex() : $column->getIndex();
            if ($column->getFilterConditionCallback()) {
                call_user_func($column->getFilterConditionCallback(), $this->getCollection(), $column);
            } else {
                $cond = $column->getFilter()->getCondition();
                if ($field && isset($cond)) {
                    // Filter added at this point
                    $this->getCollection()->addFieldToFilter($field , $cond);
                }
            }
        }
        return $this;
    }

एक संक्षिप्त परीक्षण के रूप में, मैंने रेखा को बदल दिया

$this->getCollection()->addFieldToFilter('main_table.' . $field , $cond);

और यह काम किया है, लेकिन यह इसे करने के लिए एक शानदार तरीका महसूस नहीं करता है।

_BeforeLoad () में मेरा कोड है

protected function _beforeLoad()
{
    // Join the sales_flat_order table to get order_id and and total_qty_ordered
    $this->getSelect()->joinLeft(array('sales' => $this->getTable('sales/order')),
        'main_table.increment_id = sales.increment_id',
        array('total_qty_ordered' => 'sales.total_qty_ordered',
              'order_id' => 'sales.entity_id'));

    // Join the SagePay transaction table to get vendor_tx_code
    $this->getSelect()->joinLeft(array('sagepay' => $this->getTable('sagepaysuite2/sagepaysuite_transaction')),
        'order_id = sagepay.order_id',
        array('vendor_tx_code' => 'vendor_tx_code'));

    $this->getSelect()->group('main_table.entity_id');
    parent::_beforeLoad();
}

मुझे विक्रय आदेश ग्रिड तालिका और SagePay लेन-देन तालिका में शामिल होने के लिए increment_id का उपयोग करना होगा क्योंकि मैं केवल सामान्य आईडी देख सकता हूं।

मूल रूप से मैं सोच रहा हूं कि इससे निपटने के लिए सबसे अच्छा तरीका क्या है। मैं शायद ऊपर बताए गए परिवर्तन को करने के साथ दूर हो सकता हूं, लेकिन यह सही नहीं लगता है। क्या मैं अपने सम्मिलित बयानों में कुछ भी बदल सकता हूँ?

धन्यवाद।


1
आप तालिकाओं में कैसे शामिल हुए? Zend_Db_Select मॉडल पर काम करना एक बुरा विचार है, क्योंकि magento संयुक्त तालिकाओं को रिकॉर्ड करता है और सामान्य रूप से सभी उपसर्ग जोड़ता है। मैंने शामिल होने के बारे में एक ब्लॉग लेख लिखा, शायद यह मदद करता है: blog.fabian-blechschmidt.de/articles/…
Fabian

प्रतिक्रिया के लिए धन्यवाद, मेरे पास उसका एक पाठ होगा। मैंने joinTable () का उपयोग करने की कोशिश की, लेकिन यह संग्रह मॉडल में उपलब्ध नहीं था।
पॉल

जवाबों:


52

आप संग्रह की निम्नलिखित विधि का उपयोग करके आसानी से किसी भी अस्पष्ट को हल कर सकते हैं:

  • addFilterToMap($filterName, $alias, $group = 'fields')
    • $filter- यह उस फिल्टर का नाम है जो addFieldToFilter()विधि में उपयोग किया जाता है , आपके मामले के लिएincrement_id
    • $alias- यह उस कॉलम का पूरा नाम है जो फ़िल्टर से जुड़ा है, आपके लिए यह मामला है main_table.increment_id
    • $group - संग्रह में किसी भी प्रकार की जानकारी के लिए एक मानचित्र होने का इरादा था, लेकिन अब यह केवल फिल्टर में उपयोग किया जाता है, इसलिए आप इस तर्क को छोड़ सकते हैं।

इसके अलावा, मुझे नहीं लगता कि इससे पहले कि आपके इवेंट में आने के लिए सही जगह हो, जब तक आप किसी घटना का अवलोकन नहीं कर रहे हैं। आपके मामले में _initSelect()पहले कॉल करने के साथ इसे विधि में स्थानांतरित करना बेहतर है parent::_initSelect()। आप इस तरह से शामिल होने के लिए हल करने के लिए addFilterToMap()अपने तरीके के अंदर विधि को कॉल कर सकते हैं _initSelect():

$this->addFilterToMap('increment_id', 'main_table.increment_id');

ब्याज से बाहर, _initSelect () में जुड़ना बेहतर क्यों है?
पॉल

@Paul _initSelectको हर समय केवल एक बार निष्पादित _beforeLoadकिया जाता है , इसे तब और अधिक कहा जा सकता है, जब से आप load()अपना राज्य रीसेट कर लेते हैं, एक से अधिक बार संग्रह कर सकते हैं ।
इवान चेपर्नी

@Paul साथ ही, चूंकि _beforeLoad को दो बार कॉल किया जा सकता है, आपको दूसरी कॉल पर Zend_Db_Select से एक घातक त्रुटि प्राप्त होगी।
इवान चेपर्नी

2
मैंने इस तरह की $collection = Mage::getModel("education/ticket") ->getCollection() ->addFilterToMap('updated_at', 'main_table.updated_at') ->addFilterToMap('created_at', 'main_table.created_at');
बातें कीं

@ इवानचपुर्नी, जीनियस हैं। यह दर्शाता है कि आप Magento 1 वास्तुकार के रूप में उत्कृष्ट रहे हैं
अमित बेरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.