Clase DataBase

La clase DataBase es la encargada de controlar la conexión con la base de datos y todas las tareas relacionadas con la misma. Actualmente se soportan conexiones a los motores PostgreSql y MySQL (junto con homóloga MariaDB).

Internamente se subdivide en varias clases que se engloban en función de su uso y necesidad, pero que al estar incorporadas en el núcleo del Facturascripts son «transparentes» para el desarrollador, no necesitando conocimientos avanzados para su uso.

Entre las funciones que gestiona, algunas de manera automática, está la gestión de conexión y desconexión a los datos, la creación y verificación de las estructuras de las tablas, la gestión ejecución de sentencias SQL, la gestión de transacciones y un conjunto de utilidades para el tratamiento de la información.

Advertencia

Aunque en los ejemplos usado más adelante se cree un nuevo objeto DataBase, a la hora de desarrollar no es necesario en la mayoría de casos ya que los modelos y controladores ya disponen de la propiedad dataBase que da acceso a la clase.

Acceso desde modelos y controladores

Los modelos pueden acceder a la base de datos directamente llamando a self::$dataBase. Los controladores llamando a $this->dataBase.

Para el resto de clases es necesario usar el namespace:

use FacturaScripts\Core\Base\DataBase;

$dataBase = new DataBase();

Gestión de la conexión

conected

Nos retorna un valor booleano que indica si estamos o no conectados a una base de datos.

connect

Conecta con la base de datos configurada en el config.php de la aplicación, retornando un valor booleano que indica si ha tenido éxito o no.

close

Cierra la conexión actual retornando un valor booleano que indica si ha tenido éxito o no.

version

Retorna la versión de la base de datos a la que estamos conectado.

Importante

Los métodos anteriores se muestran a modo de formación. Limitación: No es posible conectar a otra base de datos que no sea la de FacturaScripts.

FacturaScripts ya conecta automáticamente al iniciar y desconecta cuando ha terminado la ejecución. No es necesario ni aconsejable llamar manualmente a los métodos connect() o close().

Sentencias SQL

Nos permite acceder y modificar los datos de la base de datos.

Ejemplos:

/// Obtener los primeros 50 clientes
$dataBase = new DataBase();
$sql = 'SELECT * FROM clientes';
$data = $dataBase->selectLimit($sql, 50, 0);

/// Actualizar el telefono del cliente 1
$sql = 'UPDATE clientes SET telefono = ' . $dataBase->var2str('999-999999')
    . ' WHERE codcliente = ' . $dataBase->var2str('1');
$dataBase->exec($sql);

select

Ejecuta una sentencia SQL de selección de datos y nos retorna un array con el resultado. En caso de generar un error, porque la sentencia que se intenta ejecutar es errónea, retorna un valor false.

selectLimit

Ejecuta una sentencia SQL de selección de datos pero con paginación y nos retorna un array con los resultados. En caso de error nos retorna un array vacio. El rango de datos que se solicita se indica mediante los parámetros numéricos: - limit: Indica el número de registros que se desean. - offset: Indica el número de desplazamiento o posición inicial desde donde se empieza a retornar los datos.

exec

Ejecuta una sentencia SQL de ejecución o acción (insert, update o delete) retornando un valor booleano que indica si se ha realizado con éxito. Si no hay transacción abierta en el momento de ejecutar la sentencia, el proceso se encarga de crear una, confirmarla o cancelarla de acuerdo al resultado de la ejecución.

lastval

Nos retorna el último identificador de registro que se ha creado al ejecutar un Insert.

Transacciones

Permite saber y gestionar las transacciones para cambios masivos en los datos, retornando un valor booleano indicando el estado o el éxito de la operación, pudiendo en caso necesario deshacer los cambios en la base de datos. Una transacción consta de 3 pasos:

  • Iniciar la transacción
  • Realizar los cambios en los datos
  • Confirmar o Cancelar la transacción

FacturaScripts no permite hacer transacciones dentro de otras transacciones. Aunque iniciemos una transacción, si ya existe una abierta Facturascripts ignorará la nueva apertura, pero si la cerramos y en otro punto del proceso se vuelve a cerrar dará error. Lo que debemos hacer es comprobar si previamente ya existe una transacción o si la iniciamos nosotros, para que al terminar nuestro proceso cerrar o no dejar abierta la transacción para que la cierre el proceso que la ha abierto anteriormente.

Ejemplos:

/// Ejemplo ejecución directa
$dataBase = new DataBase();
$dataBase->beginTransaction();
try {
    $this->addRoleAccess($codrole, $pages);
    $dataBase->commit();
} catch (\Exception $e) {
    $dataBase->rollback();
    $this->miniLog->notice($e->getMessage());
}

/// Ejemplo comprobando si ya hay una transaccion abierta
$dataBase = new DataBase();
$newTransation = false === $dataBase->inTransaction() && $dataBase->beginTransaction();
try {
    /// update master model
    if (!parent::delete()) {
        return false;
    }

    /// update detail model data
    $detail = new Detail();
    foreach ($lines as $row) {
        $detail->id = $row->id;
        if (!$detail->updateData($date, $row->import1, $row->import2)) {
            return false;
        }
    }

    /// save transaction
    if ($newTransation) {
        $this->dataBase->commit();
    }
} catch (\Exception $e) {
    $this->miniLog->error($e->getMessage());
    return false;
} finally {
    if ($newTransation && $dataBase->inTransaction()) {
        $dataBase->rollback();
        return false;
    }
}

inTransaction

Indica si existe una transacción abierta para la conexión actual.

beginTransaction

Comienza una transacción en la base de datos para la conexión actual.

commit

Finaliza la transacción actual haciendo persistentes los cambios realizados en los datos desde el inicio de la transacción.

rollback

Finaliza la transacción actual deshaciendo los cambios realizados desde el inicio de la transación.

Gestión de estructuras

Nos dan información y tratamiento sobre la estructura de la base de datos.

tableExists

Retorna un valor boleano que indica si la tabla informada existe en la base de datos.

getTables

Retorna un array con la lista de nombres de las tablas de la base de datos.

getColumns

Retorna un array con la lista de campos de la tabla informada.

getConstraints

Retorna un array con la lista de constraints y sus propiedades de la tabla informada.

getIndexes

Retorna un array con la lista de indices de la tabla informada.

Utilidades

var2str

Transforma un valor en un texto válido para ser usado en una sentencia SQL.

escapeString

Formatea las comillas de una cadena de texto aplicando un escapado (“).

dateStyle

Retorna el formato a utilizar para los datos fecha según la base de datos.

sql2Int

Retorna el comando o función SQL para convertir una columna a numérico.