Como criar/atualizar dados com InstallData e UpgradeData no Magento 2
Tags: php, magento2, tutorial, braziliandevs
Published: 2021-10-22 12:20:13

# Contextualizando

Para gerenciar e fazer alterações nos esquemas do banco de dados de forma simplificada, o Magento possui as classes de *Install Data* e *Upgrade Data*, que criam scripts para processar o código em SQL e automaticamente inserir dados das atualizações no banco de dados. 

### Quando utilizar as instalações e atualizações de esquema?

As classes de *Install Data* e *Upgrade Data* servem para a alteração, remoção e/ou criação de  dados em uma tabela específica do banco de dados. E elas devem ser usadas em versões anteriores a versão 2.3 do Magento 2, mas para versões posteriores é recomendado o uso de classes do tipo *Data Patch*.

Outro fator que é decisório para utilização das classes *Install Data* e *Upgrade Data* é a incompatibilidade dos módulos, caso a tabela tenha sido criada através do arquivo `db_schema.xml` ou *Schema Patch*, as alterações de dados devem ser feitas por *Data Patch* e não por classes do tipo *Install Data* ou *Upgrade Data*. Essas classes devem ser usadas para quando as tabelas forem criadas com *Install Schema* e *Upgrade Schema*, saiba como criar/atualizar [Como criar/atualizar tabelas e dados com DataPatch e SchemaPatch](https://dev.to/santanaluc94/como-criar-atualizar-tabelas-e-dados-com-datapatch-e-schemapatch-5c79-temp-slug-1624915?preview=b9fb385efd136de47458eb69f0dcd55c23d1fb509a4f865df21a2783af5b28750c8b741c3191c6173c457c71518851ee4dbccc101f12dbcb8f221027).

---

# Código para a inserir dados em uma tabela

### Install Data

Essa classe será executada quando o módulo for instalado e persistirá os dados nas tabelas do banco, ou seja, essa classe pode ser utilizada para inserir, remover e/ou alterar dados no banco de uma tabela específica. As classes *Install Data* são executadas depois das classes *Install Schema*.

A classe *Install Data* deve seguir a estrutura de pastas `\{Vendor}\{Module}\Setup\InstallData` e deve implementar a interface `\Magento\Framework\Setup\InstallDataInterface`, que obriga a classe a implementar o método `install(\Magento\Framework\Setup\ModuleDataSetupInterface $setup, \Magento\Framework\Setup\ModuleContextInterface $context)`. A interface `ModuleDataSetupInterface` gera através de injeção de dependência um objeto de configuração que fornece muitas funções para interagir com o servidor do banco de dados. A interface `ModuleContextInterface` possui apenas o método `getVersion()`, que retorna a versão atual do módulo, ou seja, retorna o valor do atributo `setup_version` do arquivo `module.xml`.

```php
<?php

namespace Vendor\Module\Setup;

use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\ModuleContextInterface;

class InstallData implements InstallDataInterface
{
    public function install(
        ModuleDataSetupInterface $setup,
        ModuleContextInterface $context
    ): void {
        $setup->startSetup();
        $setup->getConnection()->insert(
            $setup->getTable('{table_name}'),
            [
                '{column_name_1}' => '{value}',
                '{column_name_2}' => 1,
                '{column_name_3}' => {true/false},
                '{column_name_n}' => '0000-00-00'
            ]
        );
        $setup->endSetup();
    }
}
```

### Upgrade Data

Essa classe será executada quando o módulo for atualizado para adicionar/remover os dados para as tabelas do banco de dados.

A classe *Upgrade Data* deve seguir a estrutura de pastas `\{Vendor}\{Module}\Setup\UpgradeData` e implementar a interface `\Magento\Framework\Setup\UpgradeDataInterface`, que obriga a classe a implementar o método `upgrade(\Magento\Framework\Setup\ModuleDataSetupInterface $setup, \Magento\Framework\Setup\ModuleContextInterface $context)`. A interface `ModuleDataSetupInterface` gera através de injeção de dependência um objeto de configuração que fornece muitas funções para interagir com o servidor do banco de dados. A interface `ModuleContextInterface` possui apenas o método `getVersion()`, que retorna a versão atual do módulo, ou seja, retorna o valor do atributo `setup_version` do arquivo `module.xml`.

```php
<?php

namespace {Vendor}\{Module}\Setup;

use Magento\Framework\Setup\UpgradeDataInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\ModuleContextInterface;

class UpgradeData implements UpgradeDataInterface
{
    public function upgrade(
        ModuleDataSetupInterface $setup,
        ModuleContextInterface $context
    ): void {
        $setup->startSetup();

        if (version_compare($context->getVersion(), '{version_to_implement}', '<')) {
            $this->upgradeVersion($setup);
        }

        $setup->endSetup();
    }

    private function upgradeVersion(ModuleDataSetupInterface $setup): void
    {
        $setup->getConnection()->insert(
            $setup->getTable('{table_name}'),
            [
                '{column_name_1}' => '{value}',
                '{column_name_2}' => 1,
                '{column_name_3}' => {true/false},
                '{column_name_n}' => '0000-00-00'
            ]
        );
    }
}
```

```xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="{Vendor}_{Module}" setup_version="{version_number}" />
</config>
```

---

# Finalizando

> Valores entre chaves (`{test}`) devem ser alterados na implementação do código.

## Habilitando as alterações

Comando para atualizar os dados e o esquema do banco de dados.

```bash
php bin/magento setup:upgrade
```

## Diretórios e Arquivos

Segue a a lista de diretórios e arquivos que devem ser criados.

```
- app/
  - code/
    - {Vendor}/
        - {Module}/
          - etc/
            - module.xml
          - Setup/
            - InstallData.php
            - UpgradeData.php
          - registration.php
          - composer.json
```