วิธีเรียกใช้ Direct SQL Queries และเข้าร่วมการรวบรวมใน Magento2


คำตอบ:


18

ในคุณบล็อกหรือไฟล์รูปแบบที่คุณต้องการในการเริ่มต้นทรัพยากรจากนั้นคุณต้องโทรเชื่อมต่อ

นั่นคือ

protected $_resource;

และ

public function __construct(
    \Magento\Backend\Block\Template\Context $context,
    \Magento\Framework\App\Resource $resource,
    array $data = []
) {
    $this->_resource = $resource;
    parent::__construct($context, $data);
}

สำหรับการเชื่อมต่อ

protected function getConnection()
{
    if (!$this->connection) {
        $this->connection = $this->_resource->getConnection('core_write');
    }

    return $this->connection;
}

ด้านล่างเป็นตัวอย่างในไฟล์บล็อก

<?php
/**pradeep.kumarrcs67@gmail.com*/
namespace Sugarcode\Test\Block;

class Joinex extends \Magento\Framework\View\Element\Template
{
    protected $_coreRegistry = null;
    protected $_orderCollectionFactory = null;
    protected $connection;
    protected $_resource;

    public function __construct(
        \Magento\Backend\Block\Template\Context $context,
        \Magento\Framework\Registry $registry,
        \Magento\Framework\App\Resource $resource,
        \Magento\Sales\Model\Resource\Order\CollectionFactory $orderCollectionFactory,
        array $data = []
    ) {
        $this->_orderCollectionFactory = $orderCollectionFactory;
        $this->_coreRegistry = $registry;
        $this->_resource = $resource;
        parent::__construct($context, $data);
    }



    public function _prepareLayout()
    {
        return parent::_prepareLayout();
    }

    protected function getConnection()
    {
        if (!$this->connection) {
            $this->connection = $this->_resource->getConnection('core_write');
        }
        return $this->connection;
    }

    public function getDirectQuery()
    {
        $table=$this->_resource->getTableName('catalog_product_entity'); 
        $sku = $this->getConnection()->fetchRow('SELECT sku,entity_id FROM ' . $table);
        return $sku;
    }

    public function getJoinLeft()
    {
          $orders = $this->_orderCollectionFactory->create();
          $orders->getSelect()->joinLeft(
            ['oce' => 'customer_entity'],
            "main_table.customer_id = oce.entity_id",
            [   
                'CONCAT(oce.firstname," ", oce.lastname) as customer_name',
                'oce.firstname',
                'oce.lastname',
                'oce.email'
            ]
        );

        //$orders->getSelect()->__toString(); $orders->printlogquery(true); exit;
        return $orders; 
    }
}

2
\Magento\Framework\App\Resourceไม่มีอยู่ (อย่างน้อยไม่ได้อยู่ใน 2.1.3) คุณไม่หมายถึงResourceConnectionเหรอ
Giel Berkers

โปรดอัปเดตคำตอบให้สอดคล้องกับเวอร์ชั่นที่ใหม่กว่าเนื่องจากดูเหมือนว่าจะถูกต้อง แต่ไม่สามารถใช้งานได้ใน Magento 2.1.5
Max

11

คุณใช้การเรียกเก่าสำหรับรุ่นเบต้า core_write และ core_read ใน rc เป็นเช่นนี้:

 protected  _resource;
  public function __construct(Context $context,
\Magento\Framework\App\ResourceConnection $resource)
  {
    $this->_resource = $resource;
    parent::__construct($context);

  }

รับอะแดปเตอร์:

$connection = $this->_resource->getConnection(\Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION);

รับตารางและเลือก:

$tblSalesOrder = $connection->getTableName('sales_order');
$result1 = $connection->fetchAll('SELECT quote_id FROM `'.$tblSalesOrder.'` WHERE entity_id='.$orderId);

จบหลักสูตรจากที่นี่


6

ฉันได้รับสิ่งนี้ตามวิธีต่อไปนี้ ฉันมีไฟล์ที่กำหนดเองซึ่งฉันกำลังสร้างวัตถุของมันและมันทำงานได้ ตรวจสอบอีกครั้ง

class Sample extends \Magento\Framework\App\Http implements \Magento\Framework\AppInterface
{

    public function sampleMethod()
    {
        $connection = $this->_objectManager->create('\Magento\Framework\App\ResourceConnection');
        $conn = $connection->getConnection();
        $select = $conn->select()
            ->from(
                ['o' => 'catalog_category_entity_varchar']
            )
            ->where('o.value=?', '2');
        $data = $conn->fetchAll($select);
        print_r($data);
    }

}

ลองและแจ้งให้เราทราบหากมันเหมาะกับคุณ


ทำงานจากคอนโทรลเลอร์
Zulkhaery Basrul

9
อย่าใช้ตัวจัดการวัตถุ แต่ใช้การฉีดอ้างอิงแทน
Giel Berkers

1

ไม่ได้ผลสำหรับฉัน :(

นี่คือไฟล์บล็อกของฉัน:

<?php
namespace Silver\Customize\Block;
use \Magento\Framework\View\Element\Template;

class Main extends Template
{    

    protected $connection;
    protected $_resource; 

    public function __construct(
        \Magento\Backend\Block\Template\Context $context,
        \Magento\Framework\App\Resource $resource
    ) {
        $this->_resource = $resource;
        parent::__construct($context, $data);
    }  


    protected function _prepareLayout()
    {
    $this->setMessage('Hello');
    $this->setName($this->getRequest()->getParam('name'));    

    }

    public function getGoodbyeMessage()
{
    return 'Goodbye World';
}

    protected function getConnection()
    {
        if (!$this->connection) {
            $this->connection = $this->_resource->getConnection('core_write');
        }
        return $this->connection;
    } 

}

ฉันได้รับข้อผิดพลาดนี้: ควรสร้างวัตถุ DOMDocument

ฉันกำลังคิดถึงอะไร


ไม่ใช่คำตอบ นอกจากนี้ฉันไม่แน่ใจว่าอะไรไม่ทำงาน คุณไม่ได้ใช้การเชื่อมต่อ $ -> fetchAll () เป็นตัวอย่างทุกที่
Maciej Paprocki

1
For Join Query,
   protected $_objectManager; 
   public function __construct(
        \Magento\Framework\ObjectManagerInterface $objectManager,
        \Test\Vendor\Model\ResourceModel\Vendor $resourceModel
    ) {
        $this->resourceModel = $resourceModel;
        $this->_objectManager = $objectManager;
    }

$collection = $this->_objectManager->create('Test\Vendor\Model\Vendor')->getCollection();
$vendor_id = 5; //get dynamic vendor id
        $collection->getSelect()->join('secondTableName as s2','main_table.entity_id = s2.vendor_id', array('*'))->where("main_table.entity_id = ".$vendor_id);

2
อย่าฉีดผู้จัดการ DI ฉีดพึ่งพา อย่างใดอย่างหนึ่งหรือTest\Vendor\Model\VendorFactory Test\Vendor\Model\Vendor\Collection
nevvermind

0

ลองอันนี้ :

    //for print log on custom log file.


    $writer = new \Zend\Log\Writer\Stream(BP . '/var/log/mylog.log');
    $logger = new \Zend\Log\Logger();
    $logger->addWriter($writer);
    $logger->info('Query cron  srarting...: ');
    try{
        $themeId=273;
        $this->_resources = \Magento\Framework\App\ObjectManager::getInstance()
        ->get('Magento\Framework\App\ResourceConnection');
        $connection= $this->_resources->getConnection();

        $negotiateTable = $this->_resources->getTableName('table_name');
        $sql = "Select * FROM " . $negotiateTable;//". WHERE id = " . $themeId . ";";
        $result = $connection->fetchAll($sql);
        foreach ($result as $item){
            $logger->info('Query cron  query data...: '.json_encode($item));
        }

    }catch (\Exception $e){
        $logger->info('Query cron  query data exception'.$e->getMessage());
    }

1
โปรดอธิบายสิ่งที่รหัสของคุณกำลังทำอยู่และวิธีแก้ปัญหาของ OP (ส่วนใดของรหัสเฉพาะ)
7ochem

0
<?php 

 $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
 $resource = $objectManager->get('Magento\Framework\App\ResourceConnection');
 $connection = $resource->getConnection();
 $tableName = $resource->getTableName('table_name');
 $attribute_information = "Select * FROM " . $tableName; //check for the  custom attribute condition". WHERE id = " . $manufacture . ";";
// fetchOne it return the one value
$result = $connection->fetchOne($attribute_information); ?>

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