डायरेक्ट SQL क्वेरी को कैसे कॉल करें और 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?
गियल बर्क

कृपया नए संस्करण के अनुसार उत्तर को अपडेट करें क्योंकि यह सही प्रतीत होता है, लेकिन Magento 2.1.5 में काम नहीं कर रहा है।
मैक्स

11

आपने बीटा संस्करण core_write के लिए पुराने कॉल का उपयोग किया है और rc में core_read इस तरह है:

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

}

कोशिश करो और मुझे पता है कि यह आपके लिए काम करता है।


काम, कंट्रोलर से।
ज़ुल्खेरी बसरुल

9
इसके बजाय ऑब्जेक्ट मैनेजर का उपयोग न करें, बल्कि निर्भरता इंजेक्शन।
गिएल बर्कर्स

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
नेवरमाइंड

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
कृपया बताएं कि आपका कोड क्या कर रहा है और यह ओपी की समस्या को कैसे हल कर रहा है (विशेष रूप से कोड का कौन सा भाग)।
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 सभी प्रत्यक्ष क्वेरी की जाँच करें।
राकेश जेसादिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.