Question

I have been trying to create a new order attribute in Magento 2, but not successful yet.

I have created a new module and this is already showing.

I added the different codes available in my setup InstallData.php but nothing worked so far.

Anybody who have successfully created an order attribute?

This is one of the code I have tried in InstallSchema.php

<?php
namespace Namespace\Module\Setup;
use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;

/**
 * @codeCoverageIgnore
 */
class InstallSchema implements InstallSchemaInterface
{

/**
 * {@inheritdoc}
 * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 */
   public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
   {
    $installer = $setup;
    $installer->startSetup();

    $installer->getConnection()->addColumn(
        $installer->getTable('quote'),
        'delivery_eta',
        [
            'type' => 'varchar',
            'nullable' => false,
            'comment' => 'Delivery ETA',
        ]
    );

    $installer->getConnection()->addColumn(
        $installer->getTable('sales_order'),
        'delivery_eta',
        [
            'type' => 'datetime',
            'nullable' => false,
            'comment' => 'Delivery ETA',
        ]
    );

    $setup->endSetup();
   }
}
Was it helpful?

Solution

The schema scripts is to create a database structure. For example, creating a table and add columns to existing table. The install data scripts is to manage the data within existing tables, adding some sample data to tables.

At first time, we run php bin/magento setup:upgrade, Magento will execute the files in following order: (Creating table structure first, and then add the data to table)

  • InstallSchema.php
  • UpgradeSchema.php
  • InstallData.php
  • UpgradeData.php

In the next time, run setup upgrade command again, only two files:

  • UpgradeSchema.php
  • UpgradeData.php

So in your case, when editing the install data script that will not effect your database anymore. If we want to re-install, we may need to remove our module from table setup_module table (and, may need to remove the old database). And run setup upgrade command again.

For the adding new order attribute, we should take a look: https://magento.stackexchange.com/a/131969/33057

OTHER TIPS

Please check the below steps to add a new attribute to sales_order, quote, and sales_invoice tables according to the new db_schema.xml format.

Custom/Module/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="sales_order" resource="sales" engine="innodb" comment="Sales Order">
        <column xsi:type="varchar" name="custom_attribute" nullable="true" length="255" comment="custom attribute"/>
    </table>
    <table name="quote" resource="checkout" engine="innodb" comment="Quote">
        <column xsi:type="varchar" name="custom_attribute" nullable="true" length="255" comment="custom attribute"/>
    </table>
    <table name="sales_invoice" resource="sales" engine="innodb" comment="Sales Invoice">
        <column xsi:type="varchar" name="custom_attribute" nullable="true" length="255" comment="custom attribute"/>
    </table>
</schema>

After that please run php bin/magento setup:upgrade command.

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top