Instalar y actualizar información con los data scripts en Magento2

Script de actualización de datos

Una herramienta en exceso útil es la posibilidad de modificar valores de la base de datos, ya sea insertando nuevos o modificando existentes.

Para esto se utilizan los data scripts, los cuales son muy similares a los scripts que modifican la estrucutra de base de datos.

Dentro del directorio Setup de nuestro módulo vamos a crear nuestro instalador de datos. Esto lo haremos con el archivo InstallData.php.

Continuando con los ejemplos del módulo Barbanet_SampleModule, nuestro instalador contendrá:

namespace Barbanet\SampleModule\Setup;
 
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
 
 
class InstallData implements InstallDataInterface
{
 
    /**
     * Install Data
     *
     * @param ModuleDataSetupInterface $setup   Module Data Setup
     * @param ModuleContextInterface   $context Module Context
     *
     * @return void
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
 
        $data = [
            [
                'Primer registro',
                'Insertando desde script de instalación de datos',
                date('Y-m-d H:i:s'),
                '1',
                'Prueba de inserción de primer registro.'
            ]
        ];
 
        foreach ($data as $row) {
            $bind = [
                'title' => $row[0],
                'content' => $row[1],
                'creation_time' => $row[2],
                'is_active' => $row[3],
                'description' => $row[4]
            ];
            $setup->getConnection()->insert(
                $setup->getTable('barbanet_samplemodule'),
                $bind
            );
        }
    }
}

Simplemente estaré insertando un registro en la tabla que ya había creado. Para lograrlo, luego de definir correctamente la versión de nuestro módulo, vamos a a la consola y ejecutamos:

bin/magento setup:upgrade

En el caso de este módulo (si recién fue instalado por primera vez), se habrá ejecutado el instalador.

Si revisamos el contenido de la tabla barbanet_samplemodule, deberíamos ver:

Registros insertados con el script de instalación

Y si controlamos el contenido de la tabla setup_module, deberíamos ver que, en este caso, el módulo está en la versión 2.10.0 (y también la versión de los datos).

Versión del módulo Barbanet_SampleModule

Ahora, supongamos que ya teníamos datos y necesitamos modificarlos. Para esto vamos a usar el script de actualización.

Crearemos entonces, también dentro del directorio Setup, el archivo UpgradeData.php, el cual contendrá:

namespace Barbanet\SampleModule\Setup;
 
use Magento\Framework\Setup\UpgradeDataInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\ModuleContextInterface;
 
 
class UpgradeData implements UpgradeDataInterface
{
 
    /**
     * Upgrade Data
     *
     * @param ModuleDataSetupInterface $setup   Module Data Setup
     * @param ModuleContextInterface   $context Module Context
     *
     * @return void
     */
    public function upgrade( ModuleDataSetupInterface $setup, ModuleContextInterface $context )
    {
        $installer = $setup;
 
        if (version_compare($context->getVersion(), '2.11.0')) {
            if ($installer->getTableRow($installer->getTable('barbanet_samplemodule'), 'row_id', 1)) {
                $installer->updateTableRow(
                    $installer->getTable('barbanet_samplemodule'),
                    'row_id',
                    1,
                    'description',
                    'Actualizado contenido con script'
                );
            }
        }
    }
}

Nuevamente, ajustamos la versión de nuestro módulo y volvemos a la consola.

bin/magento setup:upgrade

Al finalizar, deberíamos ver que el módulo subió de versión.

Versión del módulo Barbanet_SampleModule

Y si revisamos el contenido de la tabla barbanet_samplemodule, el valor de la columna description habrá sido actualizado (siempre y cuando se cumplan las condiciones del script).

Registro actualizado con el script de actualización

El código actualizado del módulo está disponible en el tag 2.11.0 en GitHub.