बाईं ओर एक संग्रह क्वेरी पर तालिका में शामिल हों


27

मैं निर्यात के लिए सिस्टम से कुछ ऑर्डर प्राप्त करने के लिए निम्नलिखित कर रहा हूं:

$orders = Mage::getModel('sales/order')->getCollection()
    ->addFieldToFilter('status', $statusToExport)
    ->addFieldToFilter('store_id', $this->processingStoreId)
    ->addFieldToFilter('updated_at', array('gteq' => date('Y-m-d H:i:s', $lastSyncTime)));

मैं में जहां यह कुछ जोड़ने की जरूरत नहीं है निर्यात करता है, तो आदेश entity_idमैं एक कस्टम तालिका में है। यदि मैं एसक्यूएल का उपयोग कर रहा था, तो मैं करूंगा:

left join myTable as mt on main_table.entity_id = mt.entity_id
where mt.entity_id is null

लेकिन मुझे यकीन नहीं है कि एक समान काम करने के लिए संग्रह क्वेरी को कैसे संशोधित किया जाए।

नोट: मैंने कोशिश की

$orders = $orders->getSelect()
    ->joinLeft(
        array("t1" => $myTable),
        "main_table.entity_id = t1.entity_id",
        array("admin_field_id" => "t1.id")
    )
    ->where("t1.id is null")

लेकिन यह इसे बदल देता है इसलिए यह एक प्रश्न है और मैं चाहता हूं कि बिक्री / ऑर्डर संग्रह वापस आ जाए।

मुझे लगता है कि मैं कुछ आसान याद कर रहा हूँ ...

संपादित करें

ठीक है, मैंने यह कोशिश की है:

$orders->getSelect()
    ->joinLeft(
        array("t1" => $myTable),
        "main_table.entity_id = t1.entity_id",
        array("admin_field_id" => "t1.id")
    )
    ->where("t1.id is null");

जब मैं (string)$orders->getSelect()इसे प्रतिध्वनित करता हूं तो वह क्वेरी देता है जिसकी मैं अपेक्षा करता हूं और जब मैं इसे चलाता हूं तो कोई परिणाम नहीं देता है। $ordersहालाँकि, अभी भी आइटम शामिल हैं। मुझे लगा कि इस बिंदु पर इस संग्रह को संशोधित करना था?

जवाबों:


53

क्वेरी को बदलने के लिए आप कर सकते हैं

$collection->getSelect()->doWhateverYouWantWithSelectObject();
foreach($collection as $order) {} // order collection

लेकिन एक तालिका में शामिल होने के लिए, आप बस उपयोग कर सकते हैं $collection->joinTable()

joinTableकेवल Mage_Eav_Model_Entity_Collection पर मौजूद है, इसका मतलब है: उत्पाद, श्रेणियां, ऑर्डर, चालान, क्रेडिटमेमो, शिपिंग, ग्राहक। (टिप्पणी के लिए साभार @Fra)

joinTable ()

लेकिन मैगेंटो के संग्रह में एक विधि है जो joinTable()मुझे 45 मिनट लग गई, यह जानने के लिए कि इसका उपयोग कैसे किया जाता है। आपके लिए इससे बचने के लिए, मैं इसे साझा करता हूं।

$productCollection->joinTable(
    array('bonus' => 'mycompany/bonus'), 'product_id=entity_id',
    array('bonus_id' => 'bonus_id')
);

पैरामीटर हैं:

public function joinTable($table, $bind, $fields = null, $cond = null, $joinType = 'inner')
  1. तालिका आसान है, यह Magento namespace/entityप्रारूप है, जिसका उपयोग आप अपने कॉन्फ़िगरेशन, संसाधन मॉडल और संग्रह में करते हैं। आप प्रारूप की एक सरणी का उपयोग कर सकते हैंarray('alias' => 'namespace/entity')
  2. बाइंड का मतलब है, आपकी SQL में ON स्टेटमेंट। यह सबसे कठिन हिस्सा था और मैं इसे बाद में विवरण में बताऊंगा। आपके फ्लैट टेबल का पहले से होना जरूरी है और आपके ईएवी टेबल के बराबर साइन के बाद। main_table.विशेषता से पहले उपयोग न करें । मैगेंटो आपके लिए ऐसा करेगा। इस पर और बाद में।
  3. फ़ील्ड एक सरणी है । यदि आप इसके बजाय एक स्ट्रिंग का उपयोग करते हैं, तो आपको यह मिलता है Warning: Invalid argument supplied for foreach() in /var/www/magento-1.6.2.0/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php on line 775:। आप प्रारूप की एक सरणी का उपयोग कर सकते हैं array('field1', 'field2', '...')याarray('alias' => 'field1', '...')
  4. हालत एक ** है कहा पे हालत में ** एसक्यूएल में।
  5. joinType। मुझे आशा है कि आप जानते हैं कि यह क्या है। लेकिन आपके पास केवल LEFT और INNER के बीच का विकल्प हैapp/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php:793

इस विषय पर अधिक


1
उस महान जानकारी के लिए धन्यवाद। आपके पहले बिंदु के आधार पर, $orders->getSelect() ->joinLeft(array("t1" => $myTable), "main_table.entity_id = t1.entity_id", array("admin_field_id" => "t1.id")) ->where("t1.id is null")आइटमों को मेरी वर्तमान सूची से बाहर नहीं करना चाहिए ?
वेबनोब

मुझे लगता है कि आप लोड करने के बाद संग्रह को संपादित करते हैं। बस xdebug के साथ अपनी स्क्रिप्ट में हुक करें और मॉडल के अंदर isLoaded फ्लैग की जाँच करें
Fabian Blechschmidt

2
यह उल्लेख करने योग्य है कि JoinTable पद्धति केवल Mage_Eav_Model_Entity_Collection के लिए उपलब्ध है
Fra

1

मुझे इसका कारण पता चला।

इससे पहले कि मैं बाईं ओर जुड़ता हूं, मैं मूल्यों की एक गिनती चाहता था, इसलिए मैंने जोड़ा

$totalOrderCount = count($orders);

हालांकि इसने संग्रह को लोड करने का कारण बना दिया, जिसका अर्थ यह था कि मैंने उस बाईं ओर को अनदेखा कर दिया जो मैं आगे कर रहा था। डिबगिंग के दौरान, वर्ब _isCollectionLoadedको देखते हुए फैबियन द्वारा एक अच्छा टिप था।

मैं अब संग्रह की गिनती प्राप्त करने के लिए ऐसा कर रहा हूं:

$countOrdersObjs = clone $orders;
$totalOrderCount = count($countOrdersObjs);
unset($countOrdersObjs);

यह मुझे लोडिंग $ordersसंग्रह के बिना परिणाम गिनने की अनुमति देता है ।

नोट: कृपया उपर के किसी भी अपवित्र को फाबियंस पोस्ट पर लागू करें क्योंकि उसने मुझे इस पर निर्देशित किया था, लेकिन मुझे लगा कि समाधान ने इसका जवाब दिया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.