मैगेंटो 2.3.1

निम्न स्थान पर डेटा पैच बनाने के बाद:

vendor/ModuleName/Setup/Patch/Data/AddMyColumnPatch.php

(AddMyColumnPatch.php के लिए नीचे दिया गया कोड)

जब मैं इस पैच को स्थापित करने के लिए bin/magento setup:upgrade चलाता हूं तो मुझे क्ली में निम्न त्रुटि मिलती है:

लेन-देन में डीडीएल स्टेटमेंट की अनुमति नहीं है

मैंने डेटा पैच का उपयोग करके अपनी तालिका में एक कॉलम जोड़ने के संदर्भ के रूप में निम्न फ़ाइल का उपयोग किया है:

vendor/magento/module-quote/Setup/Patch/Data/InstallEntityTypes.php

47 से 65 तक की पंक्तियों का पालन करें।

मेरा AddMyColumnPatch.php कोड है:

<?php
namespace Vendor\ModuleName\Setup\Patch\Data;


use Magento\Framework\Setup\Patch\DataPatchInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\Patch\PatchRevertableInterface;

use Magento\Quote\Setup\QuoteSetupFactory;
use Magento\Sales\Setup\SalesSetupFactory;

use Psr\Log\LoggerInterface;

/**
 */
class AddressSuburbPatch implements DataPatchInterface, PatchRevertableInterface
{
    /**
     * Attribute Code of the Custom Attribute
     */
    const CUSTOM_ATTRIBUTE_CODE = 'my_column';

    /**
     * @var \Magento\Framework\Setup\ModuleDataSetupInterface
     */
    private $moduleDataSetup;

    /**
     * @var \Magento\Quote\Setup\QuoteSetupFactory
     */
    private $quoteSetupFactory;


    /**
     * @var Magento\Sales\Setup\SalesSetupFactory
     */
    private $salesSetupFactory;

    /**
     * @var \Psr\Log\LoggerInterface
     */
    private $logger;

    /**
     * @param \Magento\Framework\Setup\ModuleDataSetupInterface $moduleDataSetup
     */
    public function __construct(
        ModuleDataSetupInterface $moduleDataSetup,
        QuoteSetupFactory $quoteSetupFactory,
        SalesSetupFactory $salesSetupFactory,    
        LoggerInterface $logger
    )
    {

        $this->moduleDataSetup = $moduleDataSetup;          
        $this->quoteSetupFactory = $quoteSetupFactory;
        $this->salesSetupFactory = $salesSetupFactory;            
        $this->logger = $logger;
    }

    /**
     * {@inheritdoc}
     */
    public function apply()
    {
        $this->moduleDataSetup->getConnection()->startSetup();


        $this->logger->debug('DDL Statements error');

        $quoteSetup = $this->quoteSetupFactory->create(['setup' => $this->moduleDataSetup]);

        $quoteSetup->addAttribute('quote_address', self::CUSTOM_ATTRIBUTE_CODE, ['type' => 'text']);

        $salesSetup = $this->salesSetupFactory->create(['setup' => $this->moduleDataSetup]);
        $salesSetup->addAttribute('order_address', self::CUSTOM_ATTRIBUTE_CODE, ['type' => 'text']);

        $this->logger->debug('Script working');

        $this->moduleDataSetup->getConnection()->endSetup();

    }

    /**
     * {@inheritdoc}
     */
    public static function getDependencies()
    {

        return [

        ];
    }

    public function revert()
    {
        $this->moduleDataSetup->getConnection()->startSetup();

        $this->moduleDataSetup->getConnection()->endSetup();
    }

    /**
     * {@inheritdoc}
     */
    public function getAliases()
    {

        return [];
    }
}
2
FarhanS 7 जून 2019, 01:58

1 उत्तर

सबसे बढ़िया उत्तर

घोषणात्मक स्कीमा डॉक्स के माध्यम से फिर से जाने और कोट मॉड्यूल और पेपाल मॉड्यूल के लिए कोर मैगेंटो कोड का संदर्भ देने के बाद, मुझे पता चला है कि यदि आप मैगेंटो> = 2.3 में मौजूदा तालिका में एक फ़ील्ड जोड़ना चाहते हैं, तो आपको उसके लिए कॉन्फ़िगर घोषणात्मक स्कीमा का उपयोग करना चाहिए। अधिक पढ़ें:

https://devdocs.magento.com/guides/v2.4/extension-dev-guide/declarative-schema/db-schema.html

इसलिए Vendor/ModuleName/etc के अंतर्गत एक db_schema.xml फ़ाइल बनाएं

<?xml version="1.0"?>
<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
    <table name="quote_address" resource="checkout" comment="Sales Flat Quote Address">
        <column xsi:type="varchar" name="suburb" nullable="true" length="255" comment="Suburb for Quote Address" />
    </table>
    <table name="sales_order_address" resource="sales" comment="Sales Flat Order Address">
        <column xsi:type="varchar" name="mycolumn" nullable="true" length="255" comment="mycolumn for Sales Order Address" />
    </table>
</schema>

फिर अपने db_schema के लिए श्वेतसूची इस प्रकार बनाएं:

bin/magento setup:db-declaration:generate-whitelist --module-name=Vendor_ModuleName

फिर से चलाएँ और आपका कॉलम quote_address और order_sales_address टेबल में जुड़ जाएगा।

bin/magento setup:upgrade

हालांकि, आगे की जांच से पता चला कि फ्लैट टेबल quote_address और sales_order_address में कॉलम जोड़ने के लिए डेटा पैच बनाने की कोई आवश्यकता नहीं है। केवल db_schema.xml में कॉलम घोषित करने से ही काम चलेगा।

2
Morgy 3 सितंबर 2020, 14:01