गैर-फ्लैट विशेषता द्वारा फ़िल्टर उत्पाद संग्रह


14

मैं निम्नलिखित कर रहा हूँ:

$productCollection = Mage::getModel('catalog/product')
    ->getCollection();

$productCollection
    ->addAttributeToFilter('my_attribute', 1);

my_attribute फ्लैट टेबल में नहीं है, लेकिन फ्लैट टेबल सक्षम हैं।

मुझे पूरा संग्रह मिलता रहता है।

कारण में लगता है \Mage_Catalog_Model_Resource_Product_Collection::addAttributeToSelect:

$columns = $this->getEntity()->getAttributeForSelect($attributeCode);

कोई $this->getEntity()भी उदाहरण नहीं है Mage_Catalog_Model_Resource_Product_Flatजिससे सपाट खेत मिले - और यदि कोई नहीं मिला है, तो बस शून्य मिलता है।

संग्रह फिल्टर में गैर-फ्लैट विशेषता जोड़ने का एक साफ तरीका क्या है?

मेरे मामले में इसका मतलब यह नहीं है, कि फ्लैट टेबल पर विशेषता को जोड़ना।


हाय सर क्या आप कन्फ्यूजन को दूर करने के लिए लड़े हो ?? वाट मतलब है non-flat attribute? धन्यवाद। और मैजेंटो को भ्रमित मत करो। यह पहले से ही भ्रमित है
प्रतीकात्मक

मैं उन विशेषताओं के बारे में बात कर रहा हूं जो फ्लैट इंडेक्स में नहीं हैं। ये "यूज़ इन प्रोडक्ट लिस्टिंग" के साथ "नो" पर सेट हैं।
एलेक्स

जवाबों:


18

आप स्वयं आवश्यक तालिका में शामिल हो सकते हैं।

$productCollection = Mage::getModel('catalog/product')
->getCollection();

$table = Mage::getSingleton('eav/config')->getAttribute('catalog_product', 'my_attribute')->getBackend()->getTable();
$attributeId = Mage::getSingleton('eav/config')->getAttribute('catalog_product', 'my_attribute')->getAttributeId();

$productCollection->getSelect()->join(array('attributeTable' => $table), 'e.entity_id = attributeTable.entity_id', array('my_attribute' => 'attributeTable.value'))
                            ->where("attributeTable.attribute_id = ?", $attributeId)
                            ->where("attributeTable.value = ?", 1);

आप store_id से भी जुड़ना चाह सकते हैं।


मुझे लगता है कि मुझे अभी भी समस्या होगी कि मुझे सभी दुकानों के उत्पाद नहीं मिलते। (जब भी मैंने अपने प्रश्न में मूल रूप से इस समस्या को नहीं देखा था)। ऐसा लगता है कि मैं फ्लैट सूचकांकों को पूरी तरह से अक्षम करना चाहता हूं।
एलेक्स

यदि आपको सभी उत्पादों की आवश्यकता है, तो फ्लैट टेबल आपके मित्र नहीं होंगे, हाँ।
मथियास ज़ीस

मुझे लगता है कि आप अपना प्रश्न संशोधित कर सकते हैं या मेरे उत्तर को स्वीकार कर सकते हैं (जो मूल प्रश्न के लिए काम करता है), फिर।
मथायस ज़ीस

awasome .. अवधारणा
अमित बेरा

15

एक हैक (CE 1.6.2.0+) स्थिति को एक सरणी के रूप में पारित करना है और यह विश्वास करना है कि यह इरादा के अनुसार काम करता है या नहीं:

$collection->addFieldToFilter(array(array('attribute' => 'my_attribute', 'eq' => 1)));

कोई सुराग क्यों काम करता है?
एलेक्स

3
यह काम करता है क्योंकि EAV संग्रह के लिए addFieldToFilerके लिए एक आवरण है addAttributeToFilterऔर यह एक सरणी के रूप में विशेषता पारित करने के लिए एक विकल्प होता है:if (is_array($attribute)) { $sqlArr = array(); foreach ($attribute as $condition) { $sqlArr[] = $this->_getAttributeConditionSql($condition['attribute'], $condition, $joinType); } $conditionSql = '('.implode(') OR (', $sqlArr).')'; }
मेरियस

@ क्या इसका मतलब यह है कि यह हैक नहीं है? : पी क्या मैं इसका उपयोग करने के बारे में अच्छा महसूस कर सकता हूं?
इरफान

3
@Erfan। यह कोई हैक नहीं है। यह एक विशेषता है।
मेरियस

मिठाई। यह अभी भी अजीब है कि उत्पाद तालिका कार्यान्वयन (ईआरवी / फ्लैट) एक संग्रह को छानने के रूप में सरल चीजों के लिए दूर नहीं है। क्या इसका मतलब है कि मुझे हमेशा अपने कोड में addAttributeToFilter के बजाय addFieldToFilter का उपयोग करने की आवश्यकता है, क्योंकि मुझे नहीं पता होगा कि यह ईआरवी या फ्लैट का उपयोग कर रहा है? वैसे भी AddAttributeToFilter का बिंदु क्या है?
एरफैन

6

कारण ColinM का जवाब काम करता है में कोड की वजह से है app/code/core/Mage/Catalog/Model/Resource/Product/Collection.phpकी addAttributeToFilterविधि। यदि आप इस सरणी प्रारूप का उपयोग करते हैं, तो यह कॉल नहीं करता है addAttributeToSelect। फ्लैट मोड में, addAttributeToSelectचुपचाप विफल रहता है यदि विशेषता फ्लैट टेबल में नहीं है।

(नीचे /programming/6271284/can-i-add-other-attributes-to-magentos-flat-product-catalog-table-17021620 पर मेरे उत्तर की पुनः हैश है। - मैं हूँ यकीन नहीं है कि शिष्टाचार उसके लिए क्या है, लेकिन मुझे पता है कि मुझे यह मददगार लगा होगा)

मैं फ्लैट-मोड संग्रह के लिए "साफ" समाधान चाहता था और गैर-फ्लैट विशेषताओं पर चयन कर रहा था, जो:

  • व्यवस्थापक में विशिष्ट सेटिंग रखने के लिए विशेषता की आवश्यकता नहीं होती है (इसे उपयोगकर्ता द्वारा जोड़ा जा सकता है, या सामने के छोर पर छिपाया जा सकता है)
  • दोनों फ्लैट और गैर-फ्लैट मोड के लिए काम करता है

मैंने संबंधित उत्पाद संग्रह का उपयोग किया, लेकिन यह किसी भी ईएवी संग्रह पर लागू होता है।

असफल कोड:

$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
    ->addAttributeToSelect( 'my_custom_attribute' )
    ->addAttributeToFilter( 'my_custom_attribute', 3 )
;

फ्लैट मोड में, उपरोक्त कोड चुपचाप उस विशेषता का चयन करने या फ़िल्टर करने में विफल रहता है, यदि ऐसा नहीं होता है कि यह फ्लैट टेबल में नहीं है।

चयन में जोड़ना:

$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
    ->joinAttribute( 'my_custom_attribute', 'catalog_product/my_custom_attribute', 'entity_id', null, 'left' )
    ->addAttributeToSelect( 'my_custom_attribute' )
;

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

मैंने leftयह सुनिश्चित करने के लिए कि उसमें my_custom_attributeउन उत्पादों को लाने के लिए एक ज्वाइन का उपयोग किया है , अगर यह उन उत्पादों को प्राप्त करता है। इसे बदलें innerयदि आप केवल पंक्तियों में रुचि रखते हैं जहाँ my_custom_attributeसेट किया गया है।

फ़िल्टर में जोड़ना (ऊपर कॉलिनम के अनुसार):

$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
    ->addAttributeToFilter( array( array( 'attribute' => 'my_custom_attribute', 'eq' => 3 ) ) )
;

उपरोक्त कोड इसे आपके फ़िल्टर का पालन करने के साथ ही चयन में जोड़ देगा।

(सीई 1.6.2.0 में परीक्षण किया गया)


4

में Mage_Rssमॉड्यूल वे एक hacky-विधि का इस्तेमाल किया फ्लैट टेबल निष्क्रिय करने के लिए। वे इस तथ्य का उपयोग करते हैं, कि फ्लैट टेबल हमेशा एडमिन स्टोर में बंद रहते हैं और इसलिए केवल एडमिन स्टोर का अनुकरण करते हैं।

class Mage_Rss_Helper_Data {

[...]

/**
 * Disable using of flat catalog and/or product model to prevent limiting results to single store. Probably won't
 * work inside a controller.
 *
 * @return null
 */
public function disableFlat()
{
    /* @var $flatHelper Mage_Catalog_Helper_Product_Flat */
    $flatHelper = Mage::helper('catalog/product_flat');
    if ($flatHelper->isEnabled()) {
        /* @var $emulationModel Mage_Core_Model_App_Emulation */
        $emulationModel = Mage::getModel('core/app_emulation');
        // Emulate admin environment to disable using flat model - otherwise we won't get global stats
        // for all stores
        $emulationModel->startEnvironmentEmulation(0, Mage_Core_Model_App_Area::AREA_ADMINHTML);
    }
}

अनुकरण शुरू करने के बाद आपको इसे रीसेट करना चाहिए emulationModel->stopEnvironmentEmulation()


3 दिन पहले यह जवाब कहां था? ; _;
sg3s

यहीं? 20 मार्च के बाद से
एलेक्स

1

जब आप विशेषता बनाते हैं तो यह वैश्विक स्तर और फ़िल्टर करने योग्य होना चाहिए। इस तरह यह लेयर्ड नेविगेशन में प्रयोग करने योग्य होगा। इसके अलावा यह ड्रॉपडाउन या मल्टीसेप्ट होने के लिए विशेषता की आवश्यकता होगी। मैं व्यक्तिगत रूप से इस मामले में अपनी आवश्यकताओं को फिट करने के लिए कोर फ़ाइलों को बदलने के खिलाफ सलाह दूंगा


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