Which entity allows scoped attributes?

As per my understanding you can only create custom attribute for below entity types:

  1. Customer (Scope: Global)
  2. customer_address (Scope: Global)
  3. catalog_category (Scope: Default, Website and Store)
  4. catalog_product (Scope: Default, Website and Store)

as when you have a look on eav_entity_type table's column additional_attribute_table and entity_attribute_collection you can see the values for above 4 entity_types only.

And for Customer attribute by default scope is Global (default) so you don't have to set the scope attribute. For rest i.e Catalog Category and Product you can set any scope i.e Global (default), Website or Store

For rest I don't think you can create, but if you want to create extra column for rest of the entity you can use extension attribute feature of M2


  • customer and customer_address Does not support Scope Attribute [Globle]
  • catalog_category and catalog_product Does support Scope Attribute [Default, Website and Store]

So the question is Sales tables does support Scope Attribute ? Because sales tables are stored as Flat table in Magento

Sales DOES NOT support Scope Attributes.

enter image description here

Confirmation 1 : Check the eav_entity_type table in Magento 2

  • attribute_model and entity_attribute_collection is NULL for sales related entities.
  • Where as Customer Attributes can be created Scope wise.
  • Catalog Attributes can be created Scope wise.

Confirmation 2 : Check getDefaultEntities function in Setup folder, It clears the doubt.

vendor/magento/module-customer/Setup/CustomerSetup.php

/**
     * Retrieve default entities: customer, customer_address
     *
     * @return array
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     */
    public function getDefaultEntities()
    {
        $entities = [
            'customer' => [
                'entity_type_id' => \Magento\Customer\Api\CustomerMetadataInterface::ATTRIBUTE_SET_ID_CUSTOMER,
                'entity_model' => \Magento\Customer\Model\ResourceModel\Customer::class,
                'attribute_model' => \Magento\Customer\Model\Attribute::class,
                'table' => 'customer_entity',
                'increment_model' => \Magento\Eav\Model\Entity\Increment\NumericValue::class,
                'additional_attribute_table' => 'customer_eav_attribute',
                'entity_attribute_collection' => \Magento\Customer\Model\ResourceModel\Attribute\Collection::class,
                'attributes' => [
                    'website_id' => [
                        'type' => 'static',
                        'label' => 'Associate to Website',
                        'input' => 'select',
                        'source' => \Magento\Customer\Model\Customer\Attribute\Source\Website::class,
                        'backend' => \Magento\Customer\Model\Customer\Attribute\Backend\Website::class,
                        'sort_order' => 10,
                        'position' => 10,
                        'adminhtml_only' => 1,
                    ],
                    'store_id' => [
                        'type' => 'static',
                        'label' => 'Create In',
                        'input' => 'select',
                        'source' => \Magento\Customer\Model\Customer\Attribute\Source\Store::class,
                        'backend' => \Magento\Customer\Model\Customer\Attribute\Backend\Store::class,
                        'sort_order' => 20,
                        'visible' => false,
                        'adminhtml_only' => 1,
                    ],

vendor/magento/module-catalog/Setup/CategorySetup.php

/**
     * Default entities and attributes
     *
     * @return array
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     */
    public function getDefaultEntities()
    {
        return [
            'catalog_category' => [
                'entity_type_id' => self::CATEGORY_ENTITY_TYPE_ID,
                'entity_model' => Category::class,
                'attribute_model' => Attribute::class,
                'table' => 'catalog_category_entity',
                'additional_attribute_table' => 'catalog_eav_attribute',
                'entity_attribute_collection' =>
                    Collection::class,
                'attributes' => [
                    'name' => [
                        'type' => 'varchar',
                        'label' => 'Name',
                        'input' => 'text',
                        'sort_order' => 1,
                        'global' => ScopedAttributeInterface::SCOPE_STORE,
                        'group' => 'General Information',
                    ],

vendor/magento/module-sales/Setup/SalesSetup.php

/**
     * @return array
     */
    public function getDefaultEntities()
    {
        $entities = [
            'order' => [
                'entity_type_id' => self::ORDER_ENTITY_TYPE_ID,
                'entity_model' => \Magento\Sales\Model\ResourceModel\Order::class,
                'table' => 'sales_order',
                'increment_model' => \Magento\Eav\Model\Entity\Increment\NumericValue::class,
                'increment_per_store' => true,
                'attributes' => [],
            ],
            'invoice' => [
                'entity_type_id' => self::INVOICE_PRODUCT_ENTITY_TYPE_ID,
                'entity_model' => \Magento\Sales\Model\ResourceModel\Order\Invoice::class,
                'table' => 'sales_invoice',
                'increment_model' => \Magento\Eav\Model\Entity\Increment\NumericValue::class,
                'increment_per_store' => true,
                'attributes' => [],
            ],
            'creditmemo' => [
                'entity_type_id' => self::CREDITMEMO_PRODUCT_ENTITY_TYPE_ID,
                'entity_model' => \Magento\Sales\Model\ResourceModel\Order\Creditmemo::class,
                'table' => 'sales_creditmemo',
                'increment_model' => \Magento\Eav\Model\Entity\Increment\NumericValue::class,
                'increment_per_store' => true,
                'attributes' => [],
            ],
            'shipment' => [
                'entity_type_id' => self::SHIPMENT_PRODUCT_ENTITY_TYPE_ID,
                'entity_model' => \Magento\Sales\Model\ResourceModel\Order\Shipment::class,
                'table' => 'sales_shipment',
                'increment_model' => \Magento\Eav\Model\Entity\Increment\NumericValue::class,
                'increment_per_store' => true,
                'attributes' => [],
            ],
        ];
        return $entities;
    }

In Conformation 2 - getDefaultEntities is Scope wise for Customer Attributes and Catalog as well Categories But Sales DOES NOT support Scope Attributes, It is not defined in Setup.