2012-04-04 11 views
10

में संग्रह mysql क्वेरी मुद्रित करने के लिए मान लीजिए कि मैं की तरह एक संग्रह है दो:कैसे Magento

$products = Mage::getModel('catalog/product') 
      ->getCollection() 
      ... 
      ->load(); 

मैं वास्तविक MySQL कोड कि निष्पादित हो जाता है कैसे प्रिंट करूं?

+1

यह सही जवाब है, ठीक है। 'echo $ संग्रह-> getSelectSql (सत्य);' –

+1

मेरी मूल टिप्पणी में सुधार। यह 'echo $ संग्रह-> लोड() -> getSelectSql (true)' ' –

उत्तर

18

तुम हमेशा getSelect गूंज से एक निश्चित बिंदु पर अपने एसक्यूएल क्वेरी देख सकते हैं मुद्रित कर सकते हैं दिखाया गया है:

$products = Mage::getModel('catalog/product') 
     ->getCollection(); 
echo $products->getSelect(); 

आप की तरह के तरीकों की जांच करना चाह क्वेरी पैरामीटर को बदलने के लिए:

$products->addAttributeToSelect('someattribute'); 
$products->addAttributeToFilter('someattribute', array('eq'=>'1')); 
+1

आपके उत्तर निक के साथ समस्या यह है कि जब आप विशेषताएँ या कस्टम कॉलम या अन्य चीजों को जोड़ना शुरू करते हैं, तो $ संग्रह-> getSelect() को प्रतिबिंबित करना उन जोड़ों को ध्यान में नहीं लेता है। आपको संग्रह को पहले 'echo $ संग्रह-> लोड() -> getSelect() 'जैसे लोड करना होगा। 'Echo $ संग्रह-> getSelectSql (true)' –

+0

@ShawnAbramson का उपयोग करने के लिए इसका क्लीनर, अभी भी क्वेरी से अन्य विशेषताओं को शामिल नहीं करता है। – user1240207

+0

@ user1240207 - हाँ, मुझे अभी एहसास हुआ कि आपको $ संग्रह चलाने से पहले '' '-> लोड()' '' कॉल करने की आवश्यकता है-> getSelectSql (true)। संग्रह लोड होने पर गुण क्वेरी में जोड़े जाते हैं। –

2

आप

$products->getSelect()->assemble(); 
+5

मुझे यह भी नहीं लगता कि आपको 'इकट्ठा()' की आवश्यकता है, केवल 'echo $ products-> getSelect(); ' – Max

+0

आप सही हैं: सुधार के लिए धन्यवाद! –

11

आप नीचे कोड का उपयोग करके संग्रह प्रिंट कर सकते हैं: हम का उपयोग कर getSelect()->__toString()

$products = Mage::getModel(‘catalog/product’) 
->addAttributeToFilter(‘status’, array(‘eq’ => 1)); 
echo $products->getSelect()->__toString(); 

आप http://kuldipchudasama.wordpress.com/2012/07/16/magento-print-query-of-collection/ देखा है संग्रह की क्वेरी मुद्रित कर सकते हैं? यह अच्छी तरह से काम करता है।

+0

हाँ यह अच्छी तरह से काम करता है – JoenasE

4

अधिकांश अन्य यहाँ जवाब का कहना है कि $products->getSelect() यह करना होगा - यह ठीक है अगर सभी आप इसके साथ क्या करने जा रहे हैं echo है, लेकिन तथ्य यह है getSelect() सिर्फ एक स्ट्रिंग वापस नहीं करता है, यह एक Varien_Db_Select वस्तु देता है।

उस वस्तु पर लागू echo स्वचालित रूप से, अपने __toString() विधि से चलाता है, ताकि आप केवल एसक्यूएल स्ट्रिंग मिलता है, लेकिन Mage::log() करने के लिए इसे पारित करने का प्रयास करें और आप एक बहुत अधिक अपेक्षा से मिल जाएगा।

तुम सिर्फ एसक्यूएल लॉग इन करना चाहते हैं, तो आप उपयोग कर सकते हैं:

Mage::log($products->getSelect()->__toString()); 

या कैसे वस्तु के अपने उपयोग के बारे में:

$products->printLogQuery(false, true); // don't echo, do log 

printLogQuery lib/Varien/डेटा/संग्रह में परिभाषित किया गया है /Db.php।

2

यदि आप सरल सेट true को ->load() के पहले पैरामीटर, इसलिए जैसे:

$products = Mage::getModel('catalog/product') 
      ->getCollection() 
      ... 
      ->load(true); 
0

चरण 1-

$result_colletion = print_r($collection->getSelect()); 
Mage::log($$result_colletion, null, custom_collection.log,true); 

चरण 2-

Magento व्यवस्थापक अनुभाग में है कि लॉग इन करने के बाद और सेटिंग लॉग करने में सक्षम है। कृपया नीचे देखे ।

System > Configuration > Developer > Log Settings 

चरण 3

उसके बाद var/log/ फ़ोल्डर में लॉग फ़ाइल custom_collection.log देखते हैं।

-3

चुनें eentity_id, आईएफ (at_name.value_id> 0, at_name.value, at_name_default।मूल्य) name के रूप में,

pcategory_name.value AS 'PCat', 

    eaov.value AS 'brand', 
    stoke.stock_status AS 'inStoke', 

    pcategory_name.entity_id AS 'cat_id', 
    ccei.`value` AS 'is_active' 

से catalog_product_entity के रूप में e अंदरूनी शामिल हों catalog_product_entity_varchar के रूप में at_name_default पर (at_name_defaultentity_id = eentity_id) और (at_name_defaultattribute_id = (से eav_attribute ईए वाम attribute_id चयन में शामिल हों eav_entity_type और ea.entity_type_id = et.entity_type_id पर जहां eaattribute_code = 'name' AN डी et.entity_type_code = 'catalog_product')) और at_name_defaultstore_id = 0 बायाँ शामिल हों catalog_product_entity_varchar के रूप में at_name पर (at_nameentity_id = eentity_id) और (at_nameattribute_id = (eav_attribute ईए से attribute_id का चयन करें बाईं तरफ ea.entity_type_id = et.entity_type_id कहां eaattribute_codeeav_entity_type एट शामिल हों = 'नाम' और et.entity_type_code = 'catalog_product')) और (at_namestore_id = 1) वाम cataloginventory_stock_status के शामिल होते ही stoke पर (stokeproduct_id = eentity_id)

   LEFT JOIN 
     `catalog_product_entity_varchar` AS `key` 
      ON (`key`.`entity_id` = `e`.`entity_id`) 
      AND key.attribute_id = 160 

अंदरूनी pcategory pcategory.entity_id पर के रूप में शामिल हों catalog_category_entity = (मैक्स (category_id का चयन करें) catalog_category_product से कहां product_id = e.entity_id और category_id! = 2)

अंदरूनी शामिल हों catalog_category_entity_int ccei पर के रूप में ccei। entity_id = पीसी श्रेणी। entity_id और सीसीआई। attribute_id = 34

LEFT JOIN `catalog_category_entity_varchar` AS `pcategory_name` ON pcategory_name.entity_id = pcategory.entity_id AND pcategory_name.attribute_id = 33 

वाम cpei cpei पर के रूप में catalog_product_entity_int शामिल हों। entity_id = eentity_id और cpei.entity_type_id = 4 और cpei.attribute_id = 70

वाम catalog_product_entity_intcpeis रूप में शामिल होने cpeis पर। entity_id = eentity_id

AND cpeis.attribute_id = 155 

    LEFT JOIN eav_attribute_option_value AS `eaov` ON eaov.option_id = cpei.value 

WHERE ccei.`value`=1 AND pcategory.parent_id=2 
+0

क्या आप अपने समाधान को आपके द्वारा प्रदान किए गए समाधान के बारे में थोड़ा और विवरण जोड़कर विस्तारित कर सकते हैं? – abarisone

+0

यह मुझे कहानियों की याद दिलाता है "एक आदमी को एक मछली दें, उसे एक दिन के लिए खिलाओ; उसे मछली के लिए सिखाओ, उसे जीवन के लिए खिलाओ।" पूछताछ करना चाहता है कि मछली कैसे करें और आप उन्हें सिर्फ मछली दे रहे हैं। प्लस, यह कोड पोर्टेबल नहीं है। यह विशेषता आईडी और श्रेणी आईडी का उपयोग कर रहा है जो आपके सिस्टम के लिए विशिष्ट हैं। और स्वरूपण, दोस्त ... यदि आप उपरोक्त 4 रिक्त स्थान से प्रत्येक पंक्ति को इंडेंट करेंगे तो उपरोक्त अधिक पढ़ने योग्य होगा और अभी भी सभी सही स्थानों में बैकटिक्स शामिल होंगे। –

0

Magento 2 में: -

namespace <Company>\<Module>\Block\Adminhtml\Tab\Log; 
class Grid 
extends \Magento\Backend\Block\Widget\Grid\Extended 
{ 

    protected $_collectionFactory; 

    /** 
    * Constructor 
    * 
    * @param \Magento\Backend\Block\Template\Context $context 
    * @param \Magento\Backend\Helper\Data $backendHelper 
    * @param \<Company>\<Module>\Model\ResourceModel\Log\CollectionFactory $collectionFactory 
    * @param Psr\Log\LoggerInterface $logger 
    * @param array $data 
    */ 
    public function __construct(
     \Magento\Backend\Block\Template\Context $context, 
     \<Company>\<Module>\Model\ResourceModel\Log\CollectionFactory $collectionFactory, 
     \Psr\Log\LoggerInterface $logger, 
     array $data = [] 
    ) { 
     $this->_logger = $logger; 
     $this->_collectionFactory = $collectionFactory; 
     parent::__construct($context, $backendHelper, $data); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    protected function _prepareCollection() 
    { 
     $collection = $this->_collectionFactory->create(); 
     $this->_logger->info($collection->getSelect()->__toString()); 
     $this->setCollection($collection); 
     return parent::_prepareCollection(); 
    } 
} 

और याद रखें कि संग्रह कारखाने एक जादू वर्ग है कि हर वर्ग के लिए देता कर सकते हैं के रूप में Magento 1 पर्याप्त जटिल नहीं किया गया है।

2

मैं हर दिन संग्रह के साथ काम करता हूं। यह बिना किसी संदेह के सही तरीके से है।

echo $collection->getSelectSql(true);

0

कोड का अनुसरण करें।

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

    echo $products->getSelect();