2012-04-04 17 views
10

Powiedzmy mam kolekcję takich jak:Jak drukować zbiórki zapytanie mysql w Magento

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

Jak wydrukować rzeczywisty kod MySQL, która pobiera wykonywane?

+1

To jest poprawna odpowiedź tutaj. 'echo $ collection-> getSelectSql (true);' –

+1

Korekta mojego oryginalnego komentarza. Powinien to być '' 'echo $ collection-> load() -> getSelectSql (true)' '' –

Odpowiedz

18

Zawsze można zobaczyć zapytanie sql w pewnym momencie przez echo getSelect jak pokazano:

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

Aby zmienić parametry zapytania, które chcesz sprawdzić metod, takich jak:

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

Problem z twoją odpowiedzą Nick polega na tym, że kiedy zaczynasz dodawać atrybuty lub niestandardowe kolumny lub inne rzeczy, echo $ collection-> getSelect() nie bierze pod uwagę tych dodatków. Najpierw należy wczytać kolekcję, tak jak to, 'echo $ collection-> load() -> getSelect()'. Jego czystsze w użyciu 'echo $ collection-> getSelectSql (true)' –

+0

@ShawnAbramson, nadal nie zawiera innych atrybutów z kwerendy. – user1240207

+0

@ user1240207 - tak, właśnie uświadomiłem sobie, że musisz wywołać '' '-> load()' '' przed uruchomieniem $ collection-> getSelectSql (true). Atrybuty zostaną dodane do zapytania po załadowaniu kolekcji. –

2

Można drukować

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

Nie potrzebuję nawet 'assemble()', tylko 'echo $ products-> getSelect(); ' – Max

+0

Masz rację: dziękuję za poprawę! –

4

Większość innych odpowiedzi tutaj powiedzieć, że $products->getSelect() to zrobi - to wszystko jest w porządku, jeśli masz zamiar z nim zrobić jest echo, ale w rzeczywistości getSelect() nie tylko zwracać ciąg, to zwraca obiekt Varien_Db_Select.

Wywoływanie echo na tym obiekcie automatycznie wyzwala swoją metodę __toString(), więc po prostu ciąg SQL, ale spróbuj przekazaniem go do Mage::log() a dostaniesz dużo więcej niż oczekiwano.

Jeśli chcesz tylko do logowania SQL, można użyć:

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

Albo jak o użyciu obiektu własnego:

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

printLogQuery jest zdefiniowana w lib/Varien/data/Collection /Db.php.

2

Jeśli prosty zestaw pierwszy parametr ->load() do true, tak:

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

Krok 1-

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

Krok 2-

Po tym logowaniu do panelu administracyjnego Magento i włącz rejestrowanie ustawień. Patrz poniżej .

System > Configuration > Developer > Log Settings 

Etap 3

Następnie patrz plik dziennika custom_collection.log w var/log/ folderu.

-3

WYBIERZ e. entity_id, IF (at_name.value_id> 0, at_name.value, at_name_default.wartość) AS 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' 

OD catalog_product_entity AS e INNER JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_default. entity_id = e. entity_id) I (at_name_default. attribute_id = (SELECT attribute_id OD eav_attribute ea LEFT JOIN eav_entity_type et ON ea.entity_type_id = et.entity_type_id WHERE ea. attribute_code = 'name' AN D et.entity_type_code = 'katalog_product')) ORAZ at_name_default. store_id = 0 LEWO Dołącz catalog_product_entity_varchar CO at_name ON (at_name. entity_id = e. entity_id) i (at_name. attribute_id = (SELECT attribute_id Z eav_attribute EA LEWO Dołącz eav_entity_type ET ea.entity_type_id = et.entity_type_id GDZIE ea. attribute_code = 'nazwa' AND et.entity_type_code = 'catalog_product')) I (at_name. store_id = 1) LEFT JOIN cataloginventory_stock_status AS stoke ON (stoke. product_id = e. entity_id)

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

INNER JOIN catalog_category_entity AS pcategory ON pcategory.entity_id = (SELECT MAX (category_id) ze catalog_category_product GDZIE product_id = e.entity_id I category_id! = 2)

INNER JOIN catalog_category_entity_int AS ccei ON ccei. entity_id = pcategory. entity_id I ccei. 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 

LEWO Dołącz catalog_product_entity_int CO cpei ON CPEI. entity_id = e. entity_id I cpei.entity_type_id = 4 I cpei.attribute_id = 70

LEFT JOIN catalog_product_entity_int AS cpeis NA cpeis. entity_id = e. entity_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

Czy mógłbyś jeszcze bardziej rozwinąć swoją odpowiedź, dodając nieco więcej opisu dostarczonego rozwiązania? – abarisone

+0

To przypomina mi przysłowie: "daj człowiekowi rybę, nakarm go na jeden dzień, naucz go łowić, karm go na całe życie". Pytający chce wiedzieć, jak łowić ryby, a ty po prostu dajesz im rybę. Ponadto ten kod nie jest przenośny. Używa identyfikatorów atrybutów i identyfikatorów kategorii, które są specyficzne dla twojego systemu. Formatowanie, koleś ... Gdyby po prostu wcięcie każdej linii o 4 spacje, powyższy tekst byłby znacznie czytelniejszy i nadal zawierałby odsunięcia we wszystkich właściwych miejscach. –

0

w 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(); 
    } 
} 

I pamiętaj, że fabryka kolekcja jest magia klasa, która może przywiązuje do każdej klasy jak Magento 1 nie było wystarczająco skomplikowane.

2

Pracuję z kolekcjami każdego dnia. Jest to bez wątpienia właściwa droga.

echo $collection->getSelectSql(true);

0

Spróbuj następujący kod.

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

    echo $products->getSelect();