Создайте столбец в таблице оплаты предложения в 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();
}
}
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']
);
}
}}
Надеюсь, это поможет. Мир:)
Не изменяйте основные таблицы Magento, во-первых, большее количество столбцов замедляет чтение из таблиц, и процесс обновления для продавцов может быть более сложным.
Если вы хотите добавить дополнительные свойства в объекты предложения или оплаты продаж, вы можете использовать следующие решения.
- Первый намного проще и не требует дополнительных столбцов, но его следует использовать только для хранения простых значений, таких как числа и строки:
Используйте 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
.
- Второй подход более сложный, но позволяет хранить сложные объекты с многие поля - это
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.
Как я уже сказал, этот подход более сложный, но не имеет накладных расходов для существующих таблиц, позволяет использовать сложные и мелкозернистые сущности.