Jak wydrukować kwerendę mysql kolekcji w Magento 2?

15

Jest getSelect()->__toString();dostępny w Magento 1 do wydruku kwerendy kolekcji. jak poniżej przykład

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

Czy w Magento 2 jest dostępna metoda? Znalazłem to, ->printLogQuery(true);ale nie działa dla mnie.

Aktualizacja: poniżej znajduje się kod. Staram się uzyskać produkty bestsellerów. działa idealnie, ale chcę wydrukować zapytanie do debugowania.

$this->_collection->getSelect()
                  ->joinLeft(
                'sales_order_item',
                'e.entity_id = sales_order_item.product_id',
                array('qty_ordered'=>'SUM(sales_order_item.qty_ordered)')) 
                ->group('e.entity_id') 
                ->order('qty_ordered '.$this->getCurrentDirectionReverse());
Kul
źródło
1
Proszę zamieścić pełny kod, printLogQueryz którym
testujesz
Dzięki @RaphaelatDigitalPianism za szybki komentarz. Mam poprawione pytanie z kodem.
Kul
1
możesz spróbować z $ this -> _ collection-> getSelect ();
Rakesh Jesadiya

Odpowiedzi:

37

Powyższe odpowiedzi są poprawne, ale niektóre kolekcje gromadzą tylko zaznaczenie w _beforeLoad()metodzie, w przeciwieństwie do inicjowania go w konstruktorze. Oznacza to, że otrzymasz pusty ciąg, jeśli spróbujesz wyprowadzić zapytanie SQL przed załadowaniem kolekcji.

Przykładem tego jest \Magento\Sales\Model\ResourceModel\Report\Bestsellers\Collection. Więc jeśli otrzymujesz nieoczekiwane wyniki, załaduj kolekcję (to zbuduje ostateczne zapytanie wyboru), a następnie wyślij zapytanie.

$collection->load();

// the following statements are equivalent
$collection->getSelect()->assemble();
$collection->getSelect()->__toString();
echo $collection->getSelect(); // will call magic method __toString() behind the scenes which in turn calls assemble()
Andrei
źródło
11

Możesz użyć tego samego co magento 1, aby wydrukować zapytanie w magento 2.

$collection = $this->_collection->getSelect()
                      ->joinLeft(
                    'sales_order_item',
                    'e.entity_id = sales_order_item.product_id',
                    array('qty_ordered'=>'SUM(sales_order_item.qty_ordered)')) 
                    ->group('e.entity_id') 
                    ->order('qty_ordered '.$this->getCurrentDirectionReverse());

$collection->getSelect()->__toString();
Rakesh Jesadiya
źródło
Doskonały. Nie mam tego samego dla M2. jego praca jest idealna!
Kul
8

Możesz użyć funkcji __toString () do wydrukowania zapytania w Magento 2

$collection = "Your Query";

echo $collection->getSelect()->__toString();
Książę Patel
źródło
3

Lub po prostu użyj

echo $collection->getSelect()
Khoa TruongDinh
źródło
1

Mam nadzieję, że chcesz wydrukować zapytanie, aby zidentyfikować problem nieprawidłowej liczby getize. za każdym razem, gdy użyjesz grupowania według zapytania, wówczas wywołanie funkcji getSize oznacza, że ​​poda dane pierwszego rekordu, a więc poda złą liczbę. w tym celu przed osadzeniem grupy według zapytania. powinieneś wywołać funkcję getSize. więc ustawi się przed wykonaniem grupy według zapytania.

Simbu Arasan
źródło
1

var_dump ($ collection-> getSelect () -> __ toString ());

Nam Khuat
źródło