Создайте столбец в таблице оплаты предложения в magento2


Я хочу добавить новый столбец в таблицу оплаты котировок, я пробовал скрипт, но не работает

<?php
namespace Ibnab\Additional\Setup;
use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
class InstallSchema implements InstallSchemaInterface
{
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();   
        $setup->getConnection()->addColumn(
            $setup->getTable('quote_payment'),
            'bankowner',
            [
                'type' => 'text',
                'nullable' => true  ,
                'comment' => 'Bank',
            ]
        );
        $setup->getConnection()->addColumn(
            $setup->getTable('sales_order_payment'),
            'bankowner',
            [
                'type' => 'text',
                'nullable' => true  ,
                'comment' => 'Bank',
            ]
        );
        $setup->endSetup();
  }
}
Author: Muhammad Hasham, 2019-02-15

2 answers

Попробуйте это,

Это добавит столбец bankowner в таблицу quote_payment с именем индекса bankowner. Аналогичным образом вы также можете добавить столбец в таблицу sales_order_payment.

<?php                                                                 
namespace Vendor\Madule\Setup;                                              
use Magento\Framework\Setup\ModuleContextInterface;                         
use Magento\Framework\Setup\SchemaSetupInterface;                           
use Magento\Framework\Setup\UpgradeSchemaInterface;                       
class UpgradeSchema implements UpgradeSchemaInterface{
protected $installer;
/**
 * {@inheritdoc}
 */
public function upgrade(
    SchemaSetupInterface $setup,
    ModuleContextInterface $context
) {
    $this->installer = $setup;
    $this->installer->startSetup();
    if (version_compare($context->getVersion(), "1.0.1", "<")) {
        //Add columns to existing quote table
        $this->addQuoteColumn($setup);
    }
    $this->installer->endSetup();
}

protected function addQuoteColumn($setup)
{
    $installer = $setup;
    $table_columns = [
        'bankowner' => [
            'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            'nullable' => true,
            'length' => 255,
            'comment' => 'bankowner'
        ]
    ];
    $connection = $installer->getConnection();

    foreach ($table_columns as $name => $definition) {
        $connection->addColumn($installer->getTable('quote_payment'), $name, $definition);
        $connection->addIndex(
            $installer->getTable('quote_payment', 'bankowner'),
            $installer->getIdxName('quote_payment', ['bankowner'], '', 'bankowner'),
            ['bankowner']
        );
    }
}}

Надеюсь, это поможет. Мир:)

 0
Author: Prathap Gunasekaran, 2019-02-15 10:48:21

Не изменяйте основные таблицы Magento, во-первых, большее количество столбцов замедляет чтение из таблиц, и процесс обновления для продавцов может быть более сложным.

Если вы хотите добавить дополнительные свойства в объекты предложения или оплаты продаж, вы можете использовать следующие решения.

  1. Первый намного проще и не требует дополнительных столбцов, но его следует использовать только для хранения простых значений, таких как числа и строки:

Используйте setAdditionalInformation и getAdditionalInformaiton методы Magento\Payment\Model\InfoInterface (Magento\Sales\Model\Order\Payment и Magento\Quote\Model\Quote\Payment реализовать его) для хранения любых сведений, которые будут храниться в столбце additional_information в виде строки в кодировке JSON в таблицах sales_order_payment и quote_payment. Кроме того, если вы зададите additional information свойства для объекта оплаты предложения перед размещением заказа, эти данные будут переданы в объект оплаты заказа по умолчанию. В качестве примера, чтобы установить additionalInformation и чтобы получить additionalInformation.

  1. Второй подход более сложный, но позволяет хранить сложные объекты с многие поля - это Extension Attributes - https://devdocs.magento.com/guides/v2.3/extension-dev-guide/extension_attributes/adding-attributes.html.

В этом случае вам потребуется сохранить и загрузить атрибуты расширения вручную. Например, вы определили атрибуты расширения для объектов предложения и платежа (extension_attributes.xml):

<config>
    <extension_attributes for="Magento\Sales\Api\Data\OrderPaymentInterface">
        <attribute code="bankowner" type="Custom\Api\Data\CustomAttribute" />
</extension_attributes>
    <extension_attributes for="Magento\Quote\Api\Data\PaymentInterface">
        <attribute code="bankowner" type="Custom\Api\Data\CustomAttribute" />
    </extension_attributes>

Когда вам нужно определить свой интерфейс с помощью пользовательских атрибутов:

interface CustomAttribute
{
    public function getBankOwner(): string;

    public function setBankOwner(string $title): void;
}

И создайте реализацию по умолчанию для интерфейс.

Кроме того, вам необходимо создать пользовательскую таблицу для хранения ваших атрибутов, репозитория, модели ресурсов и т.д. Вам необходимо определить пользовательские обработчики для хранения атрибутов расширения в базе данных, как в примере для хранилища - https://github.com/magento/magento2/blob/2.3-develop/app/code/Magento/Vault/Observer/AfterPaymentSaveObserver.php#L53 и загружать атрибуты - https://github.com/magento/magento2/blob/2.3-develop/app/code/Magento/Vault/Plugin/PaymentVaultAttributesLoad.php#L50.

Как я уже сказал, этот подход более сложный, но не имеет накладных расходов для существующих таблиц, позволяет использовать сложные и мелкозернистые сущности.

 1
Author: joni jones, 2019-02-20 17:59:50