Modelo de datos

Se proporciona (y se recomienda su uso) el directorio models/ para almacenar aquí las clases PHP correspondiente al modelo de datos de nuestra aplicación.

No hay ninguna norma o restricción respecto a esto, ya que cada aplicación requiere un modelo y patrones diferentes.

Se proporcionan clases de conexión y consulta a base de datos que hacen cómodo el trabajo con la BD, pero son completamente opcionales; puede usarse directamente el conjunto de funciones de PHP para MySQL, SQLite, PostgreSQL, etc. tal cual y por supuesto bibliotecas de terceros como RedBeans.

No se proporciona un ORM pues en el mercado hay diferentes soluciones PHP listas para usar.

Acceso a bases de datos

Configuración

En ZWF hay soporte para MySQL y PostgreSQL. Se representan por las cadenas my y pg respectivamente.

El sistema elegido se almacena en la clave de configuración dbSys. Por defecto es pg. Por ejemplo para cambiarlo a MySQL:

$cfg['dbSys'] = 'my';

Esta clave determina, en el sistema de autocarga de clases, si se va a buscar un fichero en el subdirectorio pg/ o my/ en cualquier módulo y también en el directorio de modelos (models/).

Los parámetros de conexión se almacenan en un array anidado. La conexión preterminada se denomina default, pero se pueden establecer tantas conexiones como se necesiten. En caso de MySQL será:

$cfg['my'] = array(
    'default' => array(
        'dbHost' => 'hostname',
        'dbUser' => 'username',
        'dbPass' => 'password',
        'dbDatabase' => 'databasename',
        'dbPort' => '3306'
    )
);

Análogamente para PostgreSQL será (en este ejemplo se usará dos perfiles):

$cfg['pg'] = array(
    'default' => array(
        'dbHost' => 'hostname',
        'dbUser' => 'username',
        'dbPass' => 'password',
        'dbDatabase' => 'databasename',
        'dbPort' => '5432'
    ),
    'production' => array(
        'dbHost' => 'hostname2',
        'dbUser' => 'username2',
        'dbPass' => 'password2',
        'dbDatabase' => 'databasename2',
        'dbPort' => '5432'
    )
);

Si en lugar del perfil default quisiéramos usar otro de forma predeterminada ( por ejemplo production), estableceremos esta clave:

$cfg['dbProfile'] = 'production';

Conexion

La conexión a la base de datos se realiza instanciando un objeto de la clase MyDB o PgDB dependiendo del motor que se quiera usar.

También puede usarse la clase DB para usar el motor predeterminado.

$db = new \zfx\DB();

Se puede especificar una conexión diferente a la predeterminada para esa instancia concreta:

$db = new \zfx\DB('production');

Consultas básicas

Una vez que está configurado el acceso a la BD, y hecha la conexion, se puede acceder directamente sin usar otras librerías ni modelos. Ejemplo:

$bd->q("UPDATE clientes SET deuda = 0");

Las clases PgDB y MyDB tienen funciones similares para realizar consultas. Estas son las tareas más habituales para realizar con un objeto de la clase PgBD o MyDB:

  • La función escape() prepara una cadena para ser usada dentro de una consulta y prevenir inyecciones de código.
  • La función q() ejecuta una consulta y no devuelve datos.
  • La función qr() ejecuta una consulta y devuelve la primera (o única) fila como un array asociativo.
  • La función qa() ejecuta una consulta y devuelve todos los resultados como un array de arrays asociativos.
  • La función qs() ejecuta una consulta pero no devuelve datos. Para obtener la siguiente fila (como un array asociativo) se usa la función next().

Ejemplo:

$bd = new PgBD();
$bd->qs("SELECT nombre FROM clientes");
$fila = $bd->next();
while ($fila)
{
    print_r($fila);
    $fila = $bd->next();
}