Inicio
NexoPOS

Migración de base de datos

Si planeas ampliar NexoPOS con módulos, entonces podrías considerar interactuar con la base de datos. Pero a menos que planees utilizar la base de datos existente, necesitarás crear tus tablas o quizá agregar nuevas columnas a las tablas existentes. Esta guía describirá cómo puedes crear migraciones para tu módulo.

¿Qué es una migración?

Una migración representa un archivo que se ejecuta durante un proceso de actualización cuyo objetivo es modificar el esquema de la base de datos. Pero no se limita a eso, ya que puede usarse para:

  • Crear nuevos permisos y roles
  • Realiza una modificación masiva en las entradas actuales
  • Etc.

Tenga en cuenta que, una vez que se ha ejecutado una migración, no se puede ejecutar de nuevo a menos que NexoPOS pierda el rastro de esa migración. Esto se puede hacer usando el comando migration forget.

Mejores prácticas de migración

Las migraciones se almacenan dentro de la carpeta «Migrations» de tu módulo. A diferencia de las migraciones de Laravel, PSR-4 se aplica a estos archivos, y luego el nombre de la clase debe coincidir mucho con el nombre del archivo. No estás obligado a crear la migración manualmente, ya que puedes usar el comando que se compartirá a continuación.

La mejor técnica es proporcionar un nombre único para cada una de tus migraciones, incluso si la tarea se realiza en la misma tabla.

Por lo general, las migraciones que actualizan tablas existentes deberían comenzar con “Update”, es decir: “UpdateBookingTableMarch10” o “UpdateBookingTablePriceColumn”. En cualquier caso, debes asegurarte de que el nombre sea único, ya que es posible que necesites crear otra migración para esa tabla en el futuro.

En caso de que quieras crear nuevas tablas en tu archivo de migración, el nombre de tu archivo podría empezar con «Create», por ejemplo, «CreateBookingTable».

Creando una migración con un comando

NexoPOS viene con un comando que te ayuda a crear una migración para tu módulo. Aquí está la firma de ese comando:

php artisan modules:migration {moduleNamespace}

Donde {moduleNamespace} debe reemplazarse por su identificador de módulo real. Justo después de haber enviado este comando, se le pedirá que proporcione el nombre de su migración.

image-17-3

El aviso permanecerá abierto para migraciones posteriores; escribe «Q» para salir.

En tu directorio de Migraciones, podrás ver tu archivo de migración.

Cómo crear una tabla

Como NexoPOS está construido sobre Laravel, necesitarás seguir las instrucciones en la documentación de Laravel para migraciones. Sin embargo, dado que el archivo de migración podría ejecutarse más de una vez, te invitaremos a realizar la verificación y comprobar si:

  • La tabla que desea crear existe
  • La columna que desea agregar o eliminar existe.

Estos se describen en la misma documentación aquí.

Actualización masiva para registros existentes

Si tienes algunas entradas en tu sistema, después de haber realizado una migración que cambia una estructura, puedes recuperar estas entradas usando su modelo para realizar una actualización masiva. Para entradas demasiado grandes para actualizar, podrías considerar el envío de un trabajo asíncrono.

Creación de roles y permisos

Las migraciones son el lugar perfecto para crear Roles y Permisos para tu módulo. Puedes seguir las instrucciones que están compartidas para crear un Rol y un Permiso.

¿Cuáles son los métodos «up» y «down»?

NexoPOS utiliza estos métodos para realizar (up) y deshacer (down) una modificación en la base de datos. Esto significa que, si deseas que NexoPOS realice una modificación en la base de datos, escribirás tu código en el método «up». Cuando se desinstale tu módulo, NexoPOS ejecutará el método «down» para todas tus migraciones.

Por lo general, no deshacemos las columnas que se agregan a las tablas creadas por el módulo. Pero para deshacer los cambios agregados a tablas externas, tendrás que comprobar nuevamente si esa columna existe.

Dependencias de migración

A veces puede que quieras que se ejecute una migración si en tu sistema está instalado y habilitado otro módulo. Esto garantizará que, si deseas cambiar el esquema de ese módulo, se creen las tablas del módulo.

Solo necesitarás proporcionar una constante DEPENDENCIES a tu módulo, que es un array con módulos de "namespace".

<?php
namespace Modules\YourModule\Migrations;

use App\Classes\Schema;
use Illuminate\Database\Schema\Blueprint;

class UpdateGastroModifiersGroup
{
    const DEPENDENCIES  =   [ 'NsGastro' ];
    
    public function up()
    {
        if ( ! Schema::hasTable('nexopos_gastro_modifiers_group') ) {
            Schema::table('nexopos_gastro_modifiers_group', function (Blueprint $table) {
                if (! Schema::hasColumn('nexopos_gastro_modifiers_group', 'wc_product_id')) {
                    $table->integer('wc_product_id')->nullable();
                }
            });
        }
    }
}

En este ejemplo, el método «up()» solo se ejecutará si el módulo «NsGastro» (que es el espacio de nombres del módulo Gastro) está instalado y habilitado. Ten en cuenta que la migración podría depender de varios módulos al mismo tiempo.

Esto significa que el módulo «YourModule» puede funcionar normalmente y actualizará automáticamente el esquema cada vez que Gastro se instale y se habilite. Esto garantizará que el módulo funcione con y sin las dependencias.

# Cómo ejecutar migraciones

No necesitas ejecutar una migración; NexoPOS realizará la migración automáticamente. Cada vez que se realiza una migración para el módulo, se guarda un registro en la tabla «modules_migrations». Eliminar ese registro obligará a NexoPOS a ejecutar esa migración nuevamente. Para mantener NexoPOS rápido, todas las migraciones ejecutadas se almacenan en caché para evitar llamadas innecesarias a la base de datos. Luego, tendrás que borrar la caché usando el siguiente comando:

php artisan cache:clear

Revertir la migración del módulo

Durante el desarrollo de tu módulo, es posible que necesites restablecer la migración creada hasta ahora. Para ello, usarás el siguiente comando:

php artisan modules:migration --forget {moduleNamespace}

Asegúrate de reemplazar {moduleNamespace} con el espacio de nombres del módulo para el que deseas restablecer las migraciones.