Se provee de una capa intermedia entre PDO y la base de datos, actualmente está disponible el soporte para PostgreSQL, MySQL/MariaDB y SQLite. Esta capa intermedia añade funcionalidades a PDO extendiendo dicha clase.
La configuración de la base de datos se realiza mediante la clase Configure
y es definida en el archivo Config/core.php
:
// Base de datos // conexión con nombre: default \sowerphp\core\Configure::write('database.default', [ 'type' => 'PostgreSQL', 'name' => 'database', 'user' => 'usuario', 'pass' => 'clave' ]);
En caso de querer especificar una IP o puerto diferentes a los por defecto, utilizar los índies host
y port
respectivamente.
Se define la clase Model_Datasource_Database
la cual funciona como un wrapper para poder cargar la clase correspondiente, crear el objeto y realizar la conexión a la base de datos. La clase que se carga depende de los parámetros definidos en la configuración de la conexión a la base de datos.
La clase sirve como un contenedor para las diferentes conexiones, cada una de estas posee un nombre, así esta clase puede permitir la conexión a múltiples bases de datos (incluyendo bases de datos diferentes).
Un ejemplo sencillo del uso de la clase Database que recupera la conexión a la base de datos de nombre default
definida en Config/core.php
es:
// recuperar objeto para el trabajo con la base de datos $db = &\sowerphp\core\Model_Datasource_Database::get();
Se podría querer recuperar otra conexión, esto se haría indicando el nombre:
// conexión con nombre otraconexion $db = &\sowerphp\core\Model_Datasource_Database::get('otraconexion');
Una vez que se obtiene el objeto se pueden utilizar los métodos asociados a este (ver ejemplo más abajo).
Supongamos el siguiente esquema en una base de datos PostgreSQL.
BEGIN; -- Parámetros de la aplicación DROP TABLE IF EXISTS parametro CASCADE; CREATE TABLE parametro ( modulo CHARACTER VARYING(60) NOT NULL, nombre CHARACTER VARYING(20) NOT NULL, valor CHARACTER VARYING(200) NOT NULL DEFAULT ''::CHARACTER VARYING, audit_programa CHARACTER VARYING(20) DEFAULT 'miframework'::CHARACTER VARYING NOT NULL, audit_usuario CHARACTER VARYING(20) DEFAULT 'miframework'::CHARACTER VARYING NOT NULL, audit_creado TIMESTAMP WITHOUT TIME zone NOT NULL DEFAULT now(), audit_modificado TIMESTAMP WITHOUT TIME zone NOT NULL DEFAULT now(), CONSTRAINT parametro_pkey PRIMARY KEY (modulo, nombre) ); COMMENT ON TABLE parametro IS 'Parámetros de la aplicación y sus módulos'; -- procedimiento para obtener los parámetros CREATE OR REPLACE FUNCTION getParametros(c_result refcursor) RETURNS SETOF refcursor AS $BODY$ BEGIN OPEN c_result FOR SELECT * FROM parametro; RETURN NEXT c_result; END; $BODY$ LANGUAGE plpgsql; -- Procedimiento para calcular la edad de "algo" a partir de su fecha CREATE OR REPLACE FUNCTION edad(v_fecha DATE) RETURNS INTEGER AS $BODY$ BEGIN RETURN FLOOR(((DATE_PART('YEAR',CURRENT_DATE)-DATE_PART('YEAR',v_fecha))* 372 + (DATE_PART('MONTH',CURRENT_DATE) - DATE_PART('MONTH',v_fecha))*31 + (DATE_PART('DAY',CURRENT_DATE)-DATE_PART('DAY',v_fecha)))/372); END $BODY$ LANGUAGE plpgsql; COMMIT;
Ejemplo de uso de la base de datos con este esquema:
<?php // obtener conexión // se asume que la configuración está guardada en config.php $db = &\sowerphp\core\Model_Datasource_Database::get(); // casos de uso // descomentar cada uno de los casos para probarlos //debug($db->getTableWithColsNames('SELECT * FROM parametro')); //debug($db->getTable('SELECT * FROM parametro')); //debug($db->getRow('SELECT * FROM parametro LIMIT 1')); //debug($db->getCol('SELECT valor FROM parametro')); //debug($db->getValue('SELECT valor FROM parametro LIMIT 1')); //$db->toCSV('SELECT * FROM parametro', 'parametros', 'parametro'); //debug($db->exec('edad', '1986-01-02')); //debug($db->getValueFromSP('edad', '1990-06-27')); //debug($db->getTableFromSP('getParametros')); //debug($db->getRowFromSP('getParametros')); //debug($db->getColFromSP('getParametros')); //debug($db->getInfoFromTable('parametro')); // cerrar conexión a la base de datos // esto cierra todas las conexiones abiertas \sowerphp\core\Model_Datasource_Database::close();
Para más información revisar la documentación de la clase Manager