วิธีการพิมพ์แบบสอบถามคอลเลกชัน mysql ใน magento 2?


15

มีgetSelect()->__toString();อยู่ใน Magento 1 สำหรับแบบสอบถามการพิมพ์ของชุดสะสม เหมือนตัวอย่างด้านล่าง

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

magento 2 มีวิธีใดบ้าง? ฉันพบสิ่งนี้->printLogQuery(true);แต่ไม่ได้ผลสำหรับฉัน

อัปเดต: ด้านล่างเป็นรหัส ฉันกำลังพยายามหาสินค้าขายดี มันใช้งานได้ดี แต่ฉันต้องการพิมพ์แบบสอบถามเพื่อแก้ไขข้อบกพร่อง

$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());

1
โปรดโพสต์รหัสเต็มรูปแบบที่คุณกำลังทดสอบprintLogQueryกับ
Raphael ที่ Digital Pianism

ขอบคุณ @ RaphaelatDigitalPianism สำหรับความคิดเห็นที่รวดเร็ว ฉันได้แก้ไขคำถามด้วยรหัส
Kul

1
คุณสามารถลองกับ $ this -> _ collection-> getSelect ();
Rakesh Jesadiya

คำตอบ:


37

คำตอบข้างต้นนั้นถูกต้อง แต่บางคอลเลกชันรวบรวมเฉพาะการเลือกใน_beforeLoad()วิธีการซึ่งแตกต่างจากการเริ่มต้นได้ในตัวสร้าง ซึ่งหมายความว่าคุณจะได้รับสตริงว่างถ้าคุณพยายามที่จะส่งออกแบบสอบถาม SQL ก่อนที่จะโหลดคอลเลกชัน

\Magento\Sales\Model\ResourceModel\Report\Bestsellers\Collectionตัวอย่างนี้คือ ดังนั้นหากคุณได้รับผลลัพธ์ที่ไม่คาดคิดให้โหลดคอลเลกชัน (ซึ่งจะสร้างคิวรีเลือกสุดท้าย) จากนั้นส่งออกคิวรี

$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()

11

คุณสามารถใช้เช่นเดียวกับ magento 1 เพื่อพิมพ์แบบสอบถามใน 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();

สมบูรณ์ ฉันไม่เหมือนกันสำหรับ M2 มันทำงานได้สมบูรณ์แบบ!
Kul



1

ฉันหวังว่าคุณต้องการพิมพ์แบบสอบถามเพื่อระบุปัญหาของการทำให้นับนับผิด เมื่อใดก็ตามที่คุณใช้กลุ่มตามแบบสอบถามแล้วเรียกใช้ฟังก์ชัน getSize หมายความว่ามันจะให้ข้อมูลบันทึกแรกดังนั้นมันจะนับผิด สำหรับสิ่งนี้ก่อนที่จะฝังกลุ่มด้วยข้อความค้นหา คุณควรเรียกใช้ฟังก์ชัน getSize ดังนั้นมันจะถูกตั้งค่าก่อนดำเนินการกลุ่มตามแบบสอบถาม


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.